我想爲我的項目創建一個記錄器,該項目具有可在所有子模塊中工作並記錄未捕獲異常的自定義處理程序。以下是我的概念驗證;請注意,我正在使用文件處理程序作爲最終將成爲我的自定義處理程序的替身。如何向全局的Python Logger對象添加處理程序?
main.py:
import logging
import sys
from module import divide
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
fh = logging.FileHandler("test.log")
fh.setLevel(logging.INFO)
logger.addHandler(fh)
def uncaught_error(exc_type, exc_value, exc_traceback):
logger.error("Uncaught Exception", exc_info = (exc_type, exc_value, exc_traceback))
sys.__excepthook__(exc_type, exc_value, exc_traceback)
return
sys.excepthook = uncaught_error
if __name__ == '__main__':
logger.info("first division problem")
print(divide(5,2))
logger.info("second division problem")
print(divide(10,0))
logger.info("end")
module.py:
import logging
logger = logging.getLogger(__name__)
def divide(a, b):
logger.info("dividing " + str(a) + " by " + str(b))
return a/b
我跑main.py後,這裏是test.log中的輸出:
first division problem
second division problem
Uncaught Exception
Traceback (most recent call last):
File "main.py", line 23, in <module>
print(divide(10,0))
File "/some/path/logging_test/module.py", line 7, in divide
return a/b
ZeroDivisionError: division by zero
的在module.py中未捕獲的異常被記錄得很漂亮,但是行
logger.info("dividing " + str(a) + " by " + str(b))
顯然什麼都沒做(沒有任何控制檯輸出)。什麼是錯誤?
它看起來像你只需要添加的處理程序中'main.py'記錄器;請嘗試使用'BasicConfig'來設置所有模塊的日誌記錄,請參閱https://docs.python.org/3/howto/logging.html中的示例。 – jonrsharpe
@jonrsharpe據我所知,'BasicConfig'只能用於內置的處理程序;當然,在上面的概念證明中沒有問題,但是當我用自己的自定義處理程序替換FileHandler時沒有問題。除非我錯了? –