今天在調程式的時候就遇到了上述問題,先猜一下下邊兩段代碼的運作結果?有沒有“日志級别”列印出來?:
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
并沒有輸出“日志級别”!為什麼呢?經過一番百度,在官網的文檔中找到了答案:

原來隻會以第一次的指派為準啊!除非使用 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
為什麼會這樣設計呢?
看一下上述官方文檔所在章節就知道了:
原來是為了線程安全啊!