python logging 日誌
logging與print 區別,為什麼需要logging?
在寫指令碼的過程中,為了除錯程式,我們往往會寫很多print列印輸出以便用於驗證,驗證正確後往往會註釋掉,一旦驗證的地方比較多,再一一註釋比較麻煩,這樣logging就應運而生了,直接把驗證資訊存在一個檔案中(例如在logging.basicConfig(裡面設定filename= 'employee.log',)or直接打印出出來,不用設定finame,就會直接列印在cmd視窗中。
簡單將日誌列印到螢幕:
import logging
logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
輸出:
WARNING:root:warning message
ERROR:root:error message
CRITICAL:root:critical message
可見,預設情況下python的logging模組將日誌列印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明預設的日誌級別設定為WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET),預設的日誌格式為日誌級別:Logger名稱:使用者輸出訊息。
上面說的basicConfig方法可以滿足你在絕大多數場景下的使用需求,但是basicConfig有一個 很大的缺點。
呼叫basicConfig其實是給root logger添加了一個handler,這樣當你的程式和別的使用了 logging的第三方模組一起工作時,會影響第三方模組的logger行為。這是由logger的繼承特性決定的。
所以我們需要使用真正的logger:
複製程式碼程式碼如下:
import logging
# 使用一個名字為fib的logger
logger = logging.getLogger('fib')
# 設定logger的level為DEBUG
logger.setLevel(logging.DEBUG)
# 建立一個輸出日誌到控制檯的StreamHandler
hdr = logging.StreamHandler()
formatter = logging.Formatter('[%(asctime)s] %(name)s:%(levelname)s: %(message)s')
hdr.setFormatter(formatter)
# 給logger新增上handler
logger.addHandler(hdr)
這樣再使用logger來進行日誌輸出就行了。不過這樣的壞處就是程式碼量比basicConfig要大不少。 所以我建議如果是非常簡單的小指令碼的話,直接使用basicConfig就可以,如果是稍微大一些 專案,建議認真配置好logger。