基本知識

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://zhung.com.tw/article/python%E4%B8%AD%E7%9A%84log%E5%88%A9%E5%99%A8-%E4%BD%BF%E7%94%A8logging%E6%A8%A1%E7%B5%84%E4%BE%86%E6%95%B4%E7%90%86print%E8%A8%8A%E6%81%AF/

https://jacychu.medium.com/python-logging%E6%A8%A1%E7%B5%84%E4%BB%8B%E7%B4%B9-f678707808ed

https://blog.csdn.net/yypsober/article/details/51800120

Last modified: 2025-03-23

Author

Comments

Write a Reply or Comment

Your email address will not be published.