2014-09-02 83 views
2

我不明白根記錄器和子記錄器之間的相互作用:爲什麼根記錄器接受來自子記錄器的日誌?

import logging 

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 

# 1. SOME LOGGER 
logger = logging.getLogger('logger') 
logger.setLevel(logging.INFO) 

# 2. ROOT LOGGER 
rootLogger = logging.getLogger() 
rootLogger.setLevel(logging.CRITICAL) 
fh = logging.FileHandler('root.log') 
fh.setLevel(logging.DEBUG) 
fh.setFormatter(formatter) 
rootLogger.addHandler(fh) 

# 
logger.info('hello') 

最後一行logger.info('hello')應該

  • 通過logger接受,因爲它具有logger.setLevel(logging.INFO)
  • rootLogger拒絕因爲它有rootLogger.setLevel(logging.CRITICAL)

但是在我的腳本結尾處,我有一個包含hello的文件root.log。爲什麼CRITICAL級別不會阻止rootLogger的消息?

回答

3

發生這種情況的原因是logger對象僅繼承分配給rootLoggerFileHandler對象,而不是對象級別。您的Logger對象設置了其自己的日誌級別,因此根本不會使用父級的日誌級別。這意味着通過logger的日誌記錄將檢查logger本身(它是INFO)的日誌級別,然後是繼承的級別FileHandler(即DEBUG) - 它不檢查父級rootLogger對象的日誌級別。因爲loggerFileHandler都設置爲INFO級別或更高級別,所以您會看到'hello'獲得記錄。

如果你不想做loggerrootLogger繼承處理中,propagate屬性設置爲「0」 logger對象:

logger = logging.getLogger('logger') 
logger.setLevel(logging.INFO) 
logger.propagate = 0 

如果你希望孩子記錄器繼承父的對數級別,請設置子女日誌級別爲NOTSET

logger = logging.getLogger('logger') 
logger.setLevel(logging.NOTSET) 
相關問題