我正在使用logging.error将Python异常消息打印到日志文件中:
import logging
try:
1/0
except ZeroDivisionError as e:
logging.error(e) # ERROR:root:division by zero
是否可以打印有关异常的更详细信息以及生成它的代码而不仅仅是异常字符串? 线号或堆栈跟踪之类的东西会很棒。
#1楼
一个干净的方法是使用format_exc()然后解析输出以获取相关部分:
from traceback import format_exc
try:
1/0
except Exception:
print 'the relevant part is: '+format_exc().split('\n')[-2]
问候
#2楼
关于SiggyF的答案未显示的logging.exception一个好处是你可以传递任意消息,并且日志记录仍将显示包含所有异常详细信息的完整回溯:
import logging
try:
1/0
except ZeroDivisionError:
logging.exception("Deliberate divide by zero traceback")
使用默认(在最新版本中)记录只是将错误打印到sys.stderr行为,它看起来像这样:
>>> 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 "", line 2, in
ZeroDivisionError: integer division or modulo by zero
#3楼
使用exc_info选项可能更好,允许您选择错误级别(如果使用exception ,它将始终显示error ):
try:
# do something here
except Exception as e:
logging.fatal(e, exc_info=True) # log exception info at FATAL log level
#4楼
这个答案来自上述优秀的答案。
在大多数应用程序中,您不会直接调用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),如下所示:
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)