使用 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.error
或logger.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 模块记录所有异常和错误的主要内容,如果未能解决你的问题,请参考以下文章