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

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

【问题讨论】:

标签: python debugging


【解决方案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" 仍会导致将堆栈跟踪打印到控制台。
  • 我也比较喜欢这个答案:stackoverflow.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2015-08-03
    • 2010-10-07
    • 2011-05-19
    • 2015-08-07
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多