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

abc*_*bar 25 python debugging

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

Fer*_*yer 57

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

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

要处理所有未捕获的异常,您可以将脚本的入口点包装在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()
Run Code Online (Sandbox Code Playgroud)

  • 将 `sys.__excepthook__(type, value, tb)` 附加到你的 `my_handler` 是不是一个好主意,这样它就可以处理异常的默认操作? (6认同)
  • @bioslime参见[this recipe](http://stackoverflow.com/a/16993115/512111),它依赖于`exc_info` kwarg来记录回溯.它似乎只适用于`logger.error`或`logger.critical`,但不适用于`logger.exception`. (3认同)
  • @Ferdinand Beyer:干净利落.有`logger.exception("未捕获异常:{0}:{1}".format(str(value .__ class __.__ name __),str(value)))`在我的情况下给出`错误 - 未捕获的异常:IndexError:list索引超出范围`和打印由于某种原因`无`.我如何获得完整的追溯?`tb`似乎是一个回溯对象,但`traceback.print_tb(tb)`也只是吐出`None`. (2认同)
  • 我也更喜欢这个答案:http://stackoverflow.com/a/16993115/512111 (2认同)