使用Python的日志模块记录所有异常和错误
我想检查一个特定后台文件中的错误,但前台程序正在控制标准错误输出,导致这个文件中的错误没有显示出来。不过,我可以使用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()