專項練習 · 9 分鐘閱讀

Python 日誌練習:級別、處理器與格式

需要上下文時,print 語句就不夠了。日誌給每條訊息一個嚴重級別、一個目的地和一種格式,讓你不必修改每個呼叫點就能檢查生產行為。

獲取命名日誌器

用 logging.getLogger 傳入穩定名稱,例如模組名。命名日誌器形成層級,設定可以共用。不要每次函式呼叫都建立新日誌器。

import logging
logger = logging.getLogger("app")
logger.setLevel(logging.INFO)
print(logger.name)

每個模組一個日誌器

級別負責過濾記錄

日誌器只處理不低於自身級別的記錄。INFO 低於 WARNING,所以日誌器設為 WARNING 時 info 呼叫會被忽略。要有意識地設定級別,而不是把所有東西都降到 DEBUG。

import logging
from io import StringIO
stream = StringIO()
logger = logging.getLogger("app")
logger.handlers[:] = [logging.StreamHandler(stream)]
logger.setLevel(logging.WARNING)
logger.propagate = False
logger.info("hidden")
logger.warning("shown")
print(stream.getvalue().strip())

低於門檻值

處理器決定目的地

處理器把記錄寫到流、檔案或其他目的地。StreamHandler 適合控制臺,也適合用 StringIO 捕獲輸出的測試。需要控制記錄去向時,顯式添加處理器。

import logging
from io import StringIO
stream = StringIO()
logger = logging.getLogger("demo")
logger.handlers[:] = [logging.StreamHandler(stream)]
logger.setLevel(logging.INFO)
logger.propagate = False
logger.info("hello")
print(stream.getvalue().strip())

可測試的流處理器

格式化器控制文字

格式化器把日誌記錄變成最終字串。格式串可以包含級別、日誌器名稱、訊息和其他記錄屬性。保持格式穩定,日誌才方便搜尋。

import logging
from io import StringIO
stream = StringIO()
handler = logging.StreamHandler(stream)
handler.setFormatter(logging.Formatter("%(levelname)s:%(message)s"))
logger = logging.getLogger("demo")
logger.handlers[:] = [handler]
logger.setLevel(logging.INFO)
logger.propagate = False
logger.warning("check")
print(stream.getvalue().strip())

級別與訊息

自己管理輸出時停止傳播

記錄會沿日誌器層級向上傳給祖先處理器。本機處理器和根日誌器都設定時,輸出可能重複。想讓日誌器自成一體時,把 propagate 設為 False。

import logging
from io import StringIO
stream = StringIO()
logger = logging.getLogger("demo")
logger.handlers[:] = [logging.StreamHandler(stream)]
logger.setLevel(logging.INFO)
logger.propagate = False
logger.info("once")
print(stream.getvalue().strip())

一條記錄,一個目的地

你的練習清單

常見問題

應該用 print 還是 logging?

訊息需要嚴重級別、過濾或不同目的地時用 logging。很小的腳本和即時偵錯用 print 也可以。

為什麼日誌訊息沒有出現?

檢查日誌器級別、處理器級別,以及是否附加了處理器。級別高於記錄嚴重程度時會被過濾。

可以測試日誌輸出嗎?

可以。給 StringIO 附加 StreamHandler,設定 propagate 為 False,呼叫日誌器,然後斷言捕獲的文字。

練習日誌

12 道題,覆蓋級別、處理器、格式化器、傳播和過濾行為。

打開練習

繼續閱讀: