如何使用调试信息记录Python错误?

我正在使用logging.error将Python异常消息打印到日志文件中: app

import logging
try:
    1/0
except ZeroDivisionError as e:
    logging.error(e)  # ERROR:root:division by zero

是否能够打印有关异常的更详细信息以及生成它的代码而不单单是异常字符串? 线号或堆栈跟踪之类的东西会很棒。 ide


#1楼

一个干净的方法是使用format_exc()而后解析输出以获取相关部分: spa

from traceback import format_exc

try:
    1/0
except Exception:
    print 'the relevant part is: '+format_exc().split('\n')[-2]

问候 日志


#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

#3楼

使用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

#4楼

这个答案来自上述优秀的答案。 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)

#5楼

引用

若是您的应用程序以其余方式记录 - 不使用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)
相关文章
相关标签/搜索