如何loggingpythonexception?

我如何在Python中loggingexception?

我看了一些选项,发现我可以使用这段代码访问实际的exception详细信息:

import sys import traceback try: 1/0 except: exc_type, exc_value, exc_traceback = sys.exc_info() traceback.print_exception(exc_type, exc_value, exc_traceback) 

我想以某种方式得到stringprint_exception()抛出到标准输出,以便我可以logging它。

要回答你的问题,你可以使用traceback.format_exception()函数得到print_exception()的string版本。 它将追踪消息作为string列表返回,而不是将其打印到标准输出,因此您可以使用它来执行所需的操作。 例如:

 import sys import traceback try: asdf except NameError: exc_type, exc_value, exc_traceback = sys.exc_info() lines = traceback.format_exception(exc_type, exc_value, exc_traceback) print ''.join('!! ' + line for line in lines) # Log it or whatever here 

这显示:

 !! Traceback (most recent call last): !! File "<stdin>", line 2, in <module> !! NameError: name 'asdf' is not defined 

但是,我肯定会推荐使用标准的Python日志logging模块,正如rlotun所build议的那样。 这不是最简单的设置,但它是非常可定制的。

看看logging.exception ( Python日志模块 )

 import logging def foo(): try: some_code() except: logging.exception('') 

这应该会自动处理获取当前exception的追踪并正确logging。

loggingexception就像在任何日志消息中添加exc_info = True关键字参数一样简单,请参阅http://docs.python.org/2/library/logging.html中的; Logger.debug条目。

例:

 try: raise Exception('lala') except Exception: logging.info('blah', exc_info=True) 

输出(当然,取决于你的日志处理程序configuration):

 2012-11-29 10:18:12,778 - root - INFO - <ipython-input-27-5af852892344> : 3 - blah Traceback (most recent call last): File "<ipython-input-27-5af852892344>", line 1, in <module> try: raise Exception('lala') Exception: lala 

首先,考虑在你的except子句中使用适当的Exceptiontypes。 然后,命名exception,您可以打印它:

 try: 1/0 except Exception as e: print e 

取决于你的Python版本,你必须使用

 except Exception, e 

在Python 3.5中,您可以在exc_info参数中传递exception实例:

 import logging try: 1/0 except Exception as e: logging.error('Error at %s', 'division', exc_info=e)