1. 什麼是 Python 的 logging 模組
Python 的logging
模組是一種標準工具,用於記錄程式的運行狀況和錯誤資訊,以便在偵錯和系統運行時進行監控。與print
語句的不同之處在於,logging
模組功能更強大,可以詳細控制日誌的級別、輸出位置和格式。因此,開發人員可以更有效地掌握程式的異常狀態與執行狀況。
日誌級別的種類與用途
- DEBUG: 詳細的偵錯資訊,主要用於開發階段。
- INFO: 一般的運行資訊,用於確認正常運作。
- WARNING: 輕微問題或注意事項,不會影響程式運作,但可能存在潛在問題。
- ERROR: 當某些功能無法正常運作時,顯示的錯誤訊息。表示程式執行出現問題。
- CRITICAL: 嚴重錯誤,表示程式無法繼續執行的致命問題。
透過適當區分各種日誌級別,可以提升日誌資訊的品質,並提高偵錯與監控的效率。
2. logging 的基本使用方法
讓我們來看看如何使用logging
模組輸出日誌的基本方法。
import logging
# 設定日誌級別與格式
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# 各級別的日誌輸出
logging.debug('偵錯資訊: 詳細的診斷資訊')
logging.info('訊息: 確認正常運作')
logging.warning('警告: 需要注意的狀態')
logging.error('錯誤: 發生問題')
logging.critical('嚴重錯誤: 系統停止')
透過logging.basicConfig()
,可以設定日誌輸出位置(預設為標準輸出)、日誌級別與格式。在上述範例中,因為設定level=logging.DEBUG
,所以會輸出 DEBUG 級別以上的所有日誌。
3. 自訂日誌的輸出位置與格式
可以更改預設的輸出位置或自訂日誌的格式。例如,要將日誌輸出到檔案,可以使用FileHandler
。
輸出到檔案與格式設定
import logging
# 設定檔案處理器
file_handler = logging.FileHandler('app.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
# 設定記錄器
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(file_handler)
# 輸出日誌
logger.debug('輸出到檔案的偵錯資訊')
logger.info('輸出到檔案的訊息')
上述程式碼透過FileHandler
將日誌輸出到app.log
檔案中,並根據Formatter
設定的格式寫入日誌訊息。
4. 日誌檔案輪替
在長期運行的情況下,為了防止日誌檔案過於龐大,檔案輪替機制非常重要。使用RotatingFileHandler
可以控制日誌檔案的大小和數量。
RotatingFileHandler
的使用範例
import logging
from logging.handlers import RotatingFileHandler
# 設定輪替處理器
handler = RotatingFileHandler('app.log', maxBytes=5000, backupCount=3)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# 設定記錄器
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
# 輸出日誌
for i in range(100):
logger.debug(f'輪替測試 {i}')
此範例將maxBytes
設定為 5000 位元組,並將backupCount
設為 3。如果日誌檔案超過設定大小,會產生新檔案並將舊檔案保存為備份。
5. 根據日誌級別輸出到不同檔案
根據不同的日誌級別輸出到不同的檔案,可以提升日誌的可讀性與分析效率。這需要使用自訂過濾器與多個FileHandler
。
日誌級別分檔輸出範例
import logging
class ErrorFilter(logging.Filter):
def filter(self, record):
return record.levelno == logging.ERROR
# ERROR 級別輸出到獨立檔案
error_handler = logging.FileHandler('error.log')
error_handler.setLevel(logging.ERROR)
error_handler.addFilter(ErrorFilter())
error_handler.setFormatter(formatter)
# 設定記錄器
logger.addHandler(error_handler)
# 輸出日誌
logger.error('ERROR 級別日誌將輸出到檔案中')
此範例建立了ErrorFilter
類別來過濾出 ERROR 級別的日誌,並將其輸出到error.log
檔案中。這樣可以將錯誤日誌與其他級別分開記錄。
6. 最佳實踐與注意事項
為了有效利用日誌功能,需要考量以下最佳實踐與注意事項。
適當使用日誌級別
- 開發階段使用
DEBUG
級別記錄詳細資訊,運行時切換到INFO
或WARNING
以記錄重要訊息。 - 避免過多的日誌輸出,以免影響系統效能,僅記錄必要資訊。
日誌安全性與隱私
- 避免將個人資料或機密資訊記錄到日誌中,必要時應對數據進行遮罩處理。
- 確保日誌檔案具備適當的權限設定,以防止未授權存取。
7. 總結
logging
模組可以有效記錄程式執行情況,並在偵錯與運行管理中發揮重要作用。透過適當設定日誌級別、輸出位置、格式與輪替機制,可以更詳細地監控程式狀態,快速發現與解決問題。請遵循最佳實踐,實現高效的日誌管理。