我正在使用logging.error
将Python异常消息打印到日志文件中: app
import logging try: 1/0 except ZeroDivisionError as e: logging.error(e) # ERROR:root:division by zero
是否能够打印有关异常的更详细信息以及生成它的代码而不单单是异常字符串? 线号或堆栈跟踪之类的东西会很棒。 ide
一个干净的方法是使用format_exc()
而后解析输出以获取相关部分: spa
from traceback import format_exc try: 1/0 except Exception: print 'the relevant part is: '+format_exc().split('\n')[-2]
问候 日志
关于SiggyF的答案未显示的logging.exception
一个好处是你能够传递任意消息,而且日志记录仍将显示包含全部异常详细信息的完整回溯: code
import logging try: 1/0 except ZeroDivisionError: logging.exception("Deliberate divide by zero traceback")
使用默认(在最新版本中)记录只是将错误打印到sys.stderr
行为,它看起来像这样: orm
>>> import logging >>> try: ... 1/0 ... except ZeroDivisionError: ... logging.exception("Deliberate divide by zero traceback") ... ERROR:root:Deliberate divide by zero traceback Traceback (most recent call last): File "<stdin>", line 2, in <module> ZeroDivisionError: integer division or modulo by zero
使用exc_info选项可能更好,容许您选择错误级别(若是使用exception
,它将始终显示error
): server
try: # do something here except Exception as e: logging.fatal(e, exc_info=True) # log exception info at FATAL log level
这个答案来自上述优秀的答案。 ip
在大多数应用程序中,您不会直接调用logging.exception(e)。 您极可能已经为您的应用程序或模块定义了一个特定的自定义记录器,以下所示: 字符串
# Set the name of the app or module my_logger = logging.getLogger('NEM Sequencer') # Set the log level my_logger.setLevel(logging.INFO) # Let's say we want to be fancy and log to a graylog2 log server graylog_handler = graypy.GELFHandler('some_server_ip', 12201) graylog_handler.setLevel(logging.INFO) my_logger.addHandler(graylog_handler)
在这种状况下,只需使用记录器来调用异常(e),以下所示: get
try: 1/0 except ZeroDivisionError, e: my_logger.exception(e)
若是您的应用程序以其余方式记录 - 不使用
logging
模块,该怎么办?
如今,能够在这里使用traceback
。
import traceback def log_traceback(ex, ex_traceback=None): if ex_traceback is None: ex_traceback = ex.__traceback__ tb_lines = [ line.rstrip('\n') for line in traceback.format_exception(ex.__class__, ex, ex_traceback)] exception_logger.log(tb_lines)
在Python 2中使用它:
try: # your function call is here except Exception as ex: _, _, ex_traceback = sys.exc_info() log_traceback(ex, ex_traceback)
在Python 3中使用它:
try: x = get_number() except Exception as ex: log_traceback(ex)