之前在用python自帶的logging包進行日志輸出的時候發現有些logging語句沒有輸出,感到比較奇怪就去查了一下logging文檔。然后發現其在設置和引用時的logging level會影響最后的輸出。logging包默認對輸出分成了6個等級:
這里的分值就代表了相應關鍵字出現的等級高低,NOTSET最低,CRITICAL最高。高等級的語句會覆蓋低等級的語句。
一般我們用logging的時候會先在主程序配置一個logging類的格式,然后在子程序中直接引用即可(舉個例子)。如果我們在設置默認格式的時候設置的等級比之后調用是的要高,那么調用的logging語句將不會輸出;反之,輸出時默認等級也會被調用語句的等級覆蓋。
下面用一個簡單的程序說明下 (更具體例子可查閱官方文檔):
import logging
import sys
def test_log_level():
# set default logging configuration
logger = logging.getLogger() # initialize logging class
logger.setLevel(logging.DEBUG) # default log level
format = logging.Formatter("%(asctime)s - %(message)s") # output format
sh = logging.StreamHandler(stream=sys.stdout) # output to standard output
sh.setFormatter(format)
logger.addHandler(sh)
# use logging to generate log ouput
logger.info("this is info")
logger.debug("this is debug")
logger.warning("this is warning")
logging.error("this is error")
logger.critical("this is critical")
test_log_level()
輸出
2016-09-13 18:53:05,966 INFO - this is info
2016-09-13 18:53:05,966 DEBUG - this is debug
2016-09-13 18:53:05,966 WARNING - this is warning
2016-09-13 18:53:05,967 ERROR - this is error
2016-09-13 18:53:05,967 CRITICAL - this is critical
如果我們把logger的等級調高,比如到INFO
logger.setLevel(logging.INFO)
那么輸出結果將是:
2016-09-13 18:52:37,492 INFO - this is info
2016-09-13 18:52:37,492 WARNING - this is warning
2016-09-13 18:52:37,492 ERROR - this is error
2016-09-13 18:52:37,492 CRITICAL - this is critical
logging.debug的調用沒有產生日志,也就是上面說的調用等級沒有超過默認等級將不會有輸出;而其他的調用等級超過默認等級的時候,日志記錄的就是調用等級。
總結:因為一般日志系統中調用最多的就是logging.INFO,所以一般默認的等級設置不會太高選擇DEBUG或INFO即可。通過調用logging的不同等級可以方便我們快速查閱標簽從而找出bug。所以個人覺得這個logging模塊還是需要好好看下文檔理解掌握下的。