只要 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: