如何使用調試信息記錄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)
相關文章
相關標籤/搜索