2011-11-08 57 views
19

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

+0

[登录在未捕获异常的可能的复制Python](http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python) –

回答

40

在程序中抛出任何异常可能是一个坏主意,因为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() 
+0

谢谢!这正是我需要的。 –

+0

将'sys.__ excepthook __(type,value,tb)'追加到'my_handler'中不是个好主意,因此它可以处理异常的默认操作? – troyane

+2

@ Ferdinand Beyer:整洁。有'logger.exception(“未捕获的异常:{0}:{1}”。格式(str(value .__ class __.__ name__),str(value)))'在我的情况下给'ERROR - 未捕获的异常:IndexError:list索引超出范围“,并由于某种原因打印出”无“。我如何获得完整的追溯? 'tb'似乎是一个追踪对象,但是'traceback.print_tb(tb)'也只是吐出'None'。 – bioslime