python 的 logging 模組

Evan
evan.fang
Published in
4 min readMay 8, 2022

只要 import logging,即可開始使用 python 內建的 log 模組。

根據訊息的種類,選擇不同層級:

import logginglogging.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

根據預設,log 的層級會是 WARNING,也就是等級低於 WARNING 的訊息,將不會輸出。透過 basicConfig 指定 log 的 level,可以調整層級:

import logginglogging.basicConfig(level=logging.DEBUG)logging.debug("debug message")
logging.info("info message")

以上使用的 logger,是所謂的 root logger。然而一般在使用 logger 時,可以透過 getLogger 來指定 logger 的名稱,以便根據不同的目的,使用不同的 logger。

例如使用當前 module 的名稱作為 logger 的名稱:

import logginglogging.basicConfig(level=logging.DEBUG)logger = logging.getLogger(__name__)logger.debug("debug message")

輸出從 root 變為 __main__:

DEBUG:__main__:debug message

如果要調整輸出的 log 格式,例如加上時間戳記,以及排版,就需要使用 formatter:

2022-05-08T13:34:26.179Z DEBUG    __main__: debug message
2022-05-08T13:34:26.179Z INFO __main__: info message
2022-05-08T13:34:26.179Z WARNING __main__: warning message
2022-05-08T13:34:26.179Z ERROR __main__: error message
2022-05-08T13:34:26.179Z CRITICAL __main__: critical message

以上範例將 handler、formatter、logger 三個 log 所需的元件分開宣告,對於理解三者間關係會有幫助。至於這三個元件的定義可以參考官方文件的說明

logger 的設定也可以寫在檔案中,像是 ini 檔,或是 yaml 檔。如此一來,可以保持 python code 的清晰。

例如將上面的 log 設定,寫成 ini 檔案:

在 python 中,使用 config.fileConfig 讀取 ini 檔案:

若希望將 log 不只是輸出到 conolse,還能同時寫入檔案,可以如此設定:

以上新增了名稱為 error 的 logger:

  • 指派了兩個 handler,使其可以同時輸出到 console 以及 file
  • qualname=error 表示這個 logger 的名稱是 error
  • propagate=0 表示訊息不要往上傳遞到其他 logger,例如 root;如果沒有設定此參數,你可能會看到一個訊息被輸出了兩次。
[loggers]
keys=root,error
[logger_error]
level=ERROR
handlers=console_handler,file_handler
qualname=error
propagate=0

file handler:

  • 透過 args 指定 log 檔名
[handler_file_handler]
class=FileHandler
formatter=simple_formatter
args=('example.log', 'w')

在 python 中可以指定 logger 的名稱為 error 來取用該 logger:

logger = logging.getLogger("error")

輸出的 log file:

--

--