2017-10-04 23 views
2

我試圖讓Python登錄的東西,儘管已經讀了logging docshow-to,我不明白它的行爲。爲什麼調用logging.info會改變我的記錄器打印的內容?

我設置全局日誌級別,然後試圖登錄的東西:

logger = logging.getLogger() 
print("Initially should be warn: %d" % logger.getEffectiveLevel()) 
logger.setLevel(logging.DEBUG) 
print("Logger level: %d" % logger.getEffectiveLevel()) 

logger.info("Maybe I am printed?") 

但運行python my_script.py只是打印:

Initially should be warn: 30 
Logger level: 10 

但是,如果我添加一行logging.info調用,例如,

logger = logging.getLogger() 
print("Initially should be warn: %d" % logger.getEffectiveLevel()) 
logger.setLevel(logging.DEBUG) 
print("Logger level: %d" % logger.getEffectiveLevel()) 

logging.info("I am printed") 
logger.info("Maybe I am printed?") 

然後記錄全部顯示:

Initially should be warn: 30 
Logger level: 10 
INFO:root:I am printed 
INFO:root:Maybe I am printed? 

什麼是logging.info在做什麼?

回答

2

第一個例子實際上會提醒你,沒有處理程序可以爲記錄器「根」see here)被發現。這是因爲,作爲建議,你沒有定義任何處理程序logger

這裏是實施logging.info

def info(msg, *args, **kwargs): 
    """ 
    Log a message with severity 'INFO' on the root logger. 
    """ 
    if len(root.handlers) == 0: 
     basicConfig() 
    root.info(msg, *args, **kwargs) 

正如你所看到的,當沒有處理程序被發現,它會調用basicConfig這將需要同時關注初始化默認處理程序,從而固定記錄在你的下面的語句。

2

調用logging.info正在配置日誌記錄處理程序和格式化程序,以便它可以輸出日誌。如果你想自己做下面的代碼將其設置:

logger = logging.getLogger() 
logger.setLevel(logging.DEBUG) 
handler = logging.StreamHandler() 
handler.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
handler.setFormatter(formatter) 
logger.addHandler(handler) 
logger.info("boo") 

上有教程的configuring logging部分配置日誌的更多細節。

logging.info調用安裝日誌記錄的代碼可在github.com中找到。它基本上只是在沒有處理程序的情況下創建處理程序。

相關問題