Table of Contents
基本知識
Log 的重要性程度 (Log Level)
重要性由低至高排列如下:DEBUG,INFO,WARNING,ERROR,CRITICAL
我們必須要在程式碼中指定要記錄的最低底限。
logging 模組的重要元件
Logger
Log 的生產者,模組內建的 Logger 叫做 root,其預設的接受端為 stdout (也就是終端機螢幕),Log Level 為 WARNING。
我們也可以自訂建立不同的 Logger,配合不同的 Log Level 來做分流。
Handler
Log 的接受者:可以是 stdout, file…
程式碼範例
1、最簡單的程式碼
使用內建的 root logger
這會直接把 Log 顯示在標準輸出 (也就是終端機螢幕) 上
import logging
# 這段不會顯示,因為預設的 Log Level 是 WARNING
logging.info('Hello world!')
logging.warning('Hi')
如果要讓 INFO 也能顯示,得做些設定
import logging
logging.basicConfig(level=logging.INFO)
logging.info('Hello world!')
logging.warning('Hi')
將 Log 寫入檔案
這會將 Log 寫入 log.txt 這個檔案。
import logging
logging.basicConfig(level=logging.INFO, filename='log.txt')
logging.info('Hello world!')
設定輸出格式
import logging
format="[%(asctime)s][%(name)-5s][%(levelname)-5s] %(message)s (%(filename)s:%(lineno)d)"
logging.basicConfig(level=logging.INFO, format=format)
logging.info('Hello world!')
logging.warning('Hi')
2、建立自訂的 Handler
這個範例我們採用自訂的 Handler 配合 logging 預設的 root Logger 來達到與之前範例相同的效果
import logging
# 建立一個寫入 mylog.txt 檔案的 Handler
file_handler = logging.FileHandler('mylog.txt')
# 建立一個格式
formatter = logging.Formatter("[%(asctime)s][%(name)-5s][%(levelname)-5s] %(message)s (%(filename)s:%(lineno)d)")
# 告訴 Handler 使用這個格式
file_handler.setFormatter(formatter)
# 將 Handler 連結到預設的 root Logger
logging.getLogger('').addHandler(file_handler)
# 另一種設定 Log Level 的方式
logging.getLogger('').setLevel(logging.INFO)
logging.info('Hello world!')
logging.warning('Hi')
建立自訂的 Logger
假設除了之前預設的 root Looger 外,我們還想建立一個 Error Logger,專門用來存放錯誤訊息 ( ERROR message)
import logging
# 建立自訂的 Error Logger
error_logger = logging.Logger('error')
# 建立一個寫入 errorlog.txt 檔案的 Handler
error_file_handler = logging.FileHandler('errorlog.txt')
# 建立一個格式
formatter = logging.Formatter("[%(asctime)s][%(name)-5s][%(levelname)-5s] %(message)s (%(filename)s:%(lineno)d)")
# 告訴 Handler 使用這個格式
error_file_handler.setFormatter(formatter)
# 將 Handler 連結到自訂的 Error Logger
error_logger.addHandler(error_file_handler)
# 設定 Log Level 的方式
error_logger.setLevel(logging.ERROR)
# 這個會發送到預設的 root logger,然後顯示於 stdout
logging.error('Somethins wrong')
# 這個會透過自訂的 logger,寫入 errorlog.txt
error_logger.error('Somebody help me')
參考資料
https://docs.python.org/3/library/logging.html
https://jacychu.medium.com/python-logging%E6%A8%A1%E7%B5%84%E4%BB%8B%E7%B4%B9-f678707808ed
Comments