2016-11-19 30 views
1

是的,我看到python文檔說:「記錄器永遠不會直接實例化,但總是通過模塊級功能logging.getLogger(name)」,但我有一個問題調試並想知道根本原因。python:區別logging.Logger和logging.getLogger

這裏是例如:

#!/usr/bin/python 
import logging 
logger = logging.getLogger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 

logger.info("test") 

使用logging.getLogger( 「測試」)這裏,日誌消息將不被打印。

如果我將logging.getLogger(「test」)更改爲logging.Logger(「test」),將會打印日誌消息。

#!/usr/bin/python 
import logging 
logger = logging.Logger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 

logger.info("test") 

或者,我們可以使用logging.getLogger( 「測試」)集記錄水平logging.DEBUG。

#!/usr/bin/python 
import logging 
logger = logging.getLogger("test") 

format = "%(asctime)s [%(levelname)-8s] %(message)s" 
handler = logging.StreamHandler() 
handler.setFormatter(logging.Formatter(format, datefmt="%Y-%m-%d %H:%M:%S")) 
handler.setLevel(logging.DEBUG) 
logger.addHandler(handler) 
logger.setLevel(logging.DEBUG) 

logger.info("test") 

回答

2

方法.getLogger("test")正在尋找的名稱"test"任何現有的記錄器的配置,而.Logger("test")正在創建一個名爲"test"默認記錄器,並設置默認的日誌級別爲0。如果getLogger方法沒有找到一個記錄器類,然後它將創建一個基本的記錄器,其有效等級爲30(https://docs.python.org/3/library/logging.html#logging-levels),它將忽略您的DEBUG消息。您可以通過logger.getEffectiveLevel()進行檢查以瞭解其差異。

理想情況下,您可以創建記錄器並根據正確的命名/配置進行設置,而不是接受默認配置。

+0

似乎並不能解釋爲什麼使用Logger(「test」)而不是getLogger(「test」)時打印的消息。他們兩個都得到了日誌級別爲0的logging.Logger對象。 – vts

+0

請參閱編輯,當我提交時沒有意識到它的一部分被切斷。 – ioneyed

+0

感謝ioneyed,我看到檢查logger.getEffectiveLevel(),.Logger(「test」)後不會從任何記錄器繼承,而.getLogger(「test」)將從具有默認日誌級別的根記錄器繼承== 30。 – vts

相關問題