我正在使用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)