使用 python 的 logging 模块记录所有异常和错误

Posted

技术标签:

【中文标题】使用 python 的 logging 模块记录所有异常和错误【英文标题】:Using python's logging module to log all exceptions and errors 【发布时间】:2011-12-24 10:42:40 【问题描述】:

我想检查特定后台文件中的错误,但标准错误流由前台程序控制,并且问题中的文件中的错误未显示。不过,我可以使用logging 模块并将输出写入文件。我想知道如何使用它来记录所有异常、错误及其回溯。

【问题讨论】:

Logging uncaught exceptions in Python的可能重复 【参考方案1】:

记录程序中抛出的任何异常可能是个坏主意,因为 Python 也将异常用于正常的控制流。

因此,您应该只记录 未捕获 异常。一旦有了异常对象,您就可以使用记录器的exception() method 轻松完成此操作。

要处理所有未捕获的异常,您可以将脚本的入口点包装在 try...except 块中,或者通过重新分配 sys.excepthook() 来安装自定义异常处理程序:

import logging
import sys

logger = logging.getLogger('mylogger')
# Configure logger to write to a file...

def my_handler(type, value, tb):
    logger.exception("Uncaught exception: 0".format(str(value)))

# Install exception handler
sys.excepthook = my_handler

# Run your main script here:
if __name__ == '__main__':
    main()

【讨论】:

sys.__excepthook__(type, value, tb) 附加到您的my_handler 不是一个好主意,这样它就可以处理异常时的默认操作? @Ferdinand Beyer:整洁。拥有logger.exception("Uncaught exception: 0: 1".format(str(value.__class__.__name__), str(value))) 在我的情况下给出ERROR - Uncaught exception: IndexError: list index out of range 并出于某种原因打印None。我如何获得完整的回溯? tb 似乎是一个回溯对象,但 traceback.print_tb(tb) 也只是吐出 None @bioslime 请参阅 this recipe,它也依赖于 exc_info kwarg 来记录回溯。它似乎只适用于logger.errorlogger.critical,但不适用于logger.exception 上面的代码对我不起作用。将 main() 替换为 hello ==== "Hello" 仍会导致将堆栈跟踪打印到控制台。 我也比较喜欢这个答案:***.com/a/16993115/512111【参考方案2】:
import sys
import logging
import traceback

# log uncaught exceptions
def log_exceptions(type, value, tb):
    for line in traceback.TracebackException(type, value, tb).format(chain=True):
        logging.exception(line)
    logging.exception(value)

    sys.__excepthook__(type, value, tb) # calls default excepthook

sys.excepthook = log_exceptions

【讨论】:

以上是关于使用 python 的 logging 模块记录所有异常和错误的主要内容,如果未能解决你的问题,请参考以下文章

Python之日志处理 logging模块

Python之日志处理(logging模块)

python中记录打印的log模块logging的用法实例

Python之日志处理(logging模块)

Python之日志处理(logging模块)

python日志处理