簡體   English   中英

如何記錄錯誤?

[英]How do I log errors?

最終,我正在嘗試編寫一個自定義日志記錄模塊來記錄一些無人日常腳本的事件,目前我正在研究如何記錄異常。

其他幾個 SO 問題建議用 function 替換 sys.excepthook 來實現這一點,但我無法讓它在我的模塊中按預期工作,所以現在我只是想讓一個基本示例正常工作,這樣我就可以開始理解了這里發生了什么事。

在 python 中,如何確保使用記錄器記錄任何異常?

上面的問題概述了他們用來實現這一目標的一些代碼,這些代碼與其他 SO 問題中可接受的答案相似/相同,但似乎沒有一個對我有用。

這是我的代碼:

import logging
import sys


logger = logging.getLogger('myapp logger')
logger.setLevel(logging.INFO)
file_log_handler = logging.FileHandler('myapp.log')
logger.addHandler(file_log_handler)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)


def _excepthook(exctype, exc, tb):
    logger.error("An unhandled exception occurred.", exc_info=(exctype, exc, tb))

sys.excepthook = _excepthook


logger.debug("Hello")
5/0 # error
logger.debug("what")

我希望這會將 ZeroDivisionError 的詳細信息打印到“myapp.log”,但是當從 VS Code 中運行時,ZeroDivisionError 異常會正常引發,並且不會將任何內容打印到“myapp.log”。

有誰知道我哪里出錯了或者我應該如何考慮/解決這個問題?

將不勝感激替換 sys.excepthook 以執行其默認行為以外的任何操作的超級簡單示例。

我試圖在 Jupyter Notebook 中對此進行測試並且遇到了同樣的問題。 無法在此處或在 VS Code 中覆蓋 sys.excepthook,它會出現。

進一步谷歌搜索,我發現了這個SO 線程,它解釋了每次執行一行代碼時 IPython 都會替換 sys.excepthook。

如果您系統上的默認 python 解釋器基於 IPython,這可能是您問題的根源。 在這種情況下,您可以嘗試在文件 >> 首選項 >> 設置 >> 擴展 >> Python >> VS Code 中的默認解釋器路徑下將 VS Code 指向備用解釋器的路徑。

在此處輸入圖像描述

另外,請注意,除非您將記錄器級別設置為“DEBUG”,否則您的 logger.debug() 命令不會寫入日志文件,因為“DEBUG”的級別低於“INFO”
在此處輸入圖像描述

- - - - - -更新 - - - - - - - - -

在我上面引用的那個 SO 線程上,如果你使用的是 IPython 解釋器,那么下面有一個來自“Michał Jabłoński”的答案,它可能對你有用。 它在 Jupyter Notebook 中對我有用。
這對我有用:

import logging
import sys
from IPython import get_ipython
ip = get_ipython()


logger = logging.getLogger('myapp logger')
logger.setLevel(logging.DEBUG)
file_log_handler = logging.FileHandler('myapp.log')
logger.addHandler(file_log_handler)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_log_handler.setFormatter(formatter)
logger.addHandler(file_log_handler)


def exception_handler(self, etype, evalue, tb, tb_offset=None):
    logger.error("An unhandled exception occurred.", exc_info=(etype, evalue, tb))

ip.set_custom_exc((Exception,), exception_handler)


logger.debug("Hello")
5/0 # error
logger.debug("what")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM