![](/img/trans.png)
[英]How do I create an SQLite 3 database handler for my Python logger?
[英]How do you add a handler to a Python Logger object globally?
我想為我的項目創建一個記錄器,該記錄器具有一個可在所有子模塊上使用的自定義處理程序,並記錄未捕獲的異常。 以下是我的概念證明; 請注意,我正在使用文件處理程序作為最終將成為我的自定義處理程序的替代。
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))
顯然什么也沒做(也沒有控制台輸出)。 怎么了
我只是遇到了這個問題,我的根日志記錄格式未在其他子模塊中使用。 我通過改變解決了這個問題
logger = logging.getLogger(__name__)
在main.py模塊中
logger = logging.getLogger()
因此它實際上是獲取root
記錄器而不是__main__
記錄器。
參見https://docs.python.org/2/library/logging.html#logging.getLogger
我有類似的問題,這就是我為解決這個問題而做的:
import logging
def divide(a, b, logger):
logger.info("dividing " + str(a) + " by " + str(b))
return a/b
通過將logger作為第三個參數傳遞來調用Divor()
print divide(5,2, logger)
在您的情況下,未為module.py設置處理程序
將您的自定義處理程序添加到您的根記錄器中,然后完成。 如果您沒有進行任何其他更改(沒有其他默認設置),則只要您其他記錄程序的級別允許,所有模塊的日志記錄都將傳遞到該處理程序。
所有(其他)記錄器都是根記錄器的后代。 此圖應有助於理解日志記錄中的信息流。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.