如何通过日志模块而不是stderr导致未捕获的异常输出?
我意识到最好的办法是:
try:
raise Exception, 'Throwing a boring exception'
except Exception, e:
logging.exception(e)
但我的情况是,如果在没有捕获异常时自动调用logging.exception(…),那就太好了。
如何通过日志模块而不是stderr导致未捕获的异常输出?
我意识到最好的办法是:
try:
raise Exception, 'Throwing a boring exception'
except Exception, e:
logging.exception(e)
但我的情况是,如果在没有捕获异常时自动调用logging.exception(…),那就太好了。
当前回答
为什么不:
import sys
import logging
import traceback
def log_except_hook(*exc_info):
text = "".join(traceback.format_exception(*exc_info()))
logging.error("Unhandled exception: %s", text)
sys.excepthook = log_except_hook
None()
下面是使用sys的输出。如上图所示:
$ python tb.py
ERROR:root:Unhandled exception: Traceback (most recent call last):
File "tb.py", line 11, in <module>
None()
TypeError: 'NoneType' object is not callable
下面是使用sys. js的输出。但是thook评论道:
$ python tb.py
Traceback (most recent call last):
File "tb.py", line 11, in <module>
None()
TypeError: 'NoneType' object is not callable
唯一的区别是前者在第一行的开头有ERROR:root:Unhandled异常。
其他回答
为什么不:
import sys
import logging
import traceback
def log_except_hook(*exc_info):
text = "".join(traceback.format_exception(*exc_info()))
logging.error("Unhandled exception: %s", text)
sys.excepthook = log_except_hook
None()
下面是使用sys的输出。如上图所示:
$ python tb.py
ERROR:root:Unhandled exception: Traceback (most recent call last):
File "tb.py", line 11, in <module>
None()
TypeError: 'NoneType' object is not callable
下面是使用sys. js的输出。但是thook评论道:
$ python tb.py
Traceback (most recent call last):
File "tb.py", line 11, in <module>
None()
TypeError: 'NoneType' object is not callable
唯一的区别是前者在第一行的开头有ERROR:root:Unhandled异常。
以Jacinda的回答为基础,但使用记录器对象:
def catchException(logger, typ, value, traceback):
logger.critical("My Error Information")
logger.critical("Type: %s" % typ)
logger.critical("Value: %s" % value)
logger.critical("Traceback: %s" % traceback)
# Use a partially applied function
func = lambda typ, value, traceback: catchException(logger, typ, value, traceback)
sys.excepthook = func
下面是一个完整的小例子,还包括一些其他技巧:
import sys
import logging
logger = logging.getLogger(__name__)
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
def handle_exception(exc_type, exc_value, exc_traceback):
if issubclass(exc_type, KeyboardInterrupt):
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback))
sys.excepthook = handle_exception
if __name__ == "__main__":
raise RuntimeError("Test unhandled")
忽略KeyboardInterrupt,这样控制台python程序就可以用Ctrl + C退出。 完全依赖python的日志模块来格式化异常。 使用带有示例处理程序的自定义日志记录器。这一个将未处理的异常更改为stdout而不是stderr,但是您可以以相同的样式向记录器对象添加各种处理程序。
方法sys。如果异常未被捕获,将调用Excepthook: http://docs.python.org/library/sys.html#sys.excepthook
当异常被引发并未被捕获时,解释器调用sys. js。Excepthook包含三个参数,异常类、异常实例和一个回溯对象。在交互式会话中,这发生在控制返回到提示符之前;在Python程序中,这发生在程序退出之前。这种顶级异常的处理可以通过给sys.excepthook分配另一个三个参数的函数来定制。
也许你可以在模块的顶部做一些事情,将stderr重定向到一个文件,然后在底部记录该文件
sock = open('error.log', 'w')
sys.stderr = sock
doSomething() #makes errors and they will log to error.log
logging.exception(open('error.log', 'r').read() )