天天看點

python logging.basicConfig()調用多次以哪次為準?

今天在調程式的時候就遇到了上述問題,先猜一下下邊兩段代碼的運作結果?有沒有“日志級别”列印出來?:

logging.basicConfig(
            format='[%(processName)s-%(process)d] [%(filename)s:%(lineno)s] %(message)s',
            level=logging.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S'
        )

logging.basicConfig(
            format='%(levelname)7s [%(processName)s-%(process)d] [%(filename)s:%(lineno)s] %(message)s',
            level=logging.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S'
        )           

在測試之前,按照慣性思維去想,結果應該是會有“日志級别”輸出吧?畢竟後邊的指派會覆寫前邊的指派,但真實結果卻是:

[MainProcess-23556] [t.py:37] sd
[MainProcess-23556] [t.py:24] operator           

并沒有輸出“日志級别”!為什麼呢?經過一番百度,在官網的文檔中找到了答案:

python logging.basicConfig()調用多次以哪次為準?

原來隻會以第一次的指派為準啊!除非使用 force 參數,再來試一把 force 參數:

logging.basicConfig(
            format='[%(processName)s-%(process)d] [%(filename)s:%(lineno)s] %(message)s',
            level=logging.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S'
        )

logging.basicConfig(
            format='%(levelname)7s [%(processName)s-%(process)d] [%(filename)s:%(lineno)s] %(message)s',
            level=logging.DEBUG,
            datefmt='%Y-%m-%d %H:%M:%S',
            force=True
        )           

這次結果就是後邊的一種格式了:

INFO [MainProcess-23633] [t.py:38] sd
   INFO [MainProcess-23633] [t.py:25] operator           

為什麼會這樣設計呢?

看一下上述官方文檔所在章節就知道了:

python logging.basicConfig()調用多次以哪次為準?

原來是為了線程安全啊!