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

49 投票
3 回答
45774 浏览
提问于 2025-04-17 05:52

我想检查一个特定后台文件中的错误,但前台程序正在控制标准错误输出,导致这个文件中的错误没有显示出来。不过,我可以使用logging模块把输出写入一个文件。我在想,怎么才能用这个模块记录所有的异常、错误以及它们的详细信息呢?

3 个回答

3

受主要回答的启发,加上如何使用Python的logging模块写入文件?在excepthook中打印原始异常的内容,这里介绍如何将完整的错误追踪信息写入一个名为test.log的文件,就像在控制台中打印的一样:

import logging, sys, traceback
logger = logging.getLogger('logger')
fh = logging.FileHandler('test.log')
logger.addHandler(fh)
def exc_handler(exctype, value, tb):
    logger.exception(''.join(traceback.format_exception(exctype, value, tb)))
sys.excepthook = exc_handler
print("hello")
1/0
3
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

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

91

在程序中记录任何异常可能不是个好主意,因为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()

撰写回答