【Python 的 logging 模組完全指南】從基本設定到高級應用方法全面解析

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級別記錄詳細資訊,運行時切換到INFOWARNING以記錄重要訊息。
  • 避免過多的日誌輸出,以免影響系統效能,僅記錄必要資訊。

日誌安全性與隱私

  • 避免將個人資料或機密資訊記錄到日誌中,必要時應對數據進行遮罩處理。
  • 確保日誌檔案具備適當的權限設定,以防止未授權存取。

7. 總結

logging模組可以有效記錄程式執行情況,並在偵錯與運行管理中發揮重要作用。透過適當設定日誌級別、輸出位置、格式與輪替機制,可以更詳細地監控程式狀態,快速發現與解決問題。請遵循最佳實踐,實現高效的日誌管理。