Python - 日誌記錄



Python 中的日誌記錄

日誌記錄是在程式執行期間記錄訊息的過程,以提供執行時資訊,這些資訊可用於監控、除錯和審計。

在 Python 中,日誌記錄是透過內建的 logging 模組實現的,該模組提供了一個靈活的框架來生成日誌訊息。

日誌記錄的優勢

以下是使用 Python 日誌記錄的優勢 −

  • 除錯 − 透過在程式執行期間捕獲相關資訊來幫助識別和診斷問題。

  • 監控 − 提供對應用程式行為和效能的洞察。

  • 審計 − 為安全目的保留重要事件和操作的記錄。

  • 故障排除 − 促進跟蹤程式流程和變數值以瞭解意外行為。

Python 日誌記錄的元件

Python 日誌記錄包含幾個關鍵元件,這些元件協同工作以有效地管理和輸出日誌訊息 −

  • 日誌器 − 它是您用來發出日誌訊息的主要入口點。每個日誌器例項都有名稱,並且可以獨立配置。

  • 處理器 − 它確定日誌訊息傳送到的位置。處理器將日誌訊息傳送到不同的目標,例如控制檯、檔案、套接字等。

  • 格式化器 − 它指定日誌訊息的佈局。格式化器透過指定要包含哪些資訊(例如,時間戳、日誌級別、訊息)來定義日誌記錄的結構。

  • 日誌級別 − 它定義日誌訊息的嚴重性級別。低於此級別的訊息將被忽略。常見的級別包括 DEBUG、INFO、WARNING、ERROR 和 CRITICAL。

  • 過濾器 − 它是可選元件,可提供更精細的控制,以控制處理器處理和發出的日誌記錄。

日誌級別

Python 中的日誌級別定義了日誌訊息的嚴重性,允許開發人員根據其重要性對訊息進行分類和過濾。每個日誌級別都有特定的用途,並有助於理解已記錄資訊的意義 −

  • DEBUG − 詳細的資訊,通常僅對除錯目的有用。這些訊息用於跟蹤程式的流程,通常不會在生產環境中看到。

  • INFO − 確認事情按預期工作。這些訊息提供有關應用程式進度的一般資訊。

  • WARNING − 指示可能存在的問題,這些問題不會阻止程式執行,但可能需要關注。這些訊息可用於提醒開發人員注意意外情況。

  • ERROR − 指示更嚴重的問題,這些問題會阻止特定功能或操作成功完成。這些訊息突出顯示需要立即關注的錯誤,但不一定終止應用程式。

  • CRITICAL − 最嚴重的級別,指示可能導致程式終止的嚴重錯誤。這些訊息保留用於需要立即干預的關鍵故障。

用法

以下是 Python 應用程式中每個日誌級別的使用場景 −

選擇正確的級別 − 選擇合適的日誌級別可確保日誌訊息提供相關資訊,而不會使日誌混亂。

設定級別 - 可以為記錄器、處理器和特定日誌訊息配置不同的級別,以控制記錄哪些訊息以及將其輸出到哪裡。

層次結構 - 日誌級別是分層的,這意味著在記錄器上設定級別也會影響與其關聯的處理器和日誌訊息。

基本日誌記錄示例

以下是 Python 中的基本日誌記錄示例,用於演示其用法和功能 -

import logging

# Configure logging
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

# Example usage
def calculate_sum(a, b):
   logging.debug(f"Calculating sum of {a} and {b}")
   result = a + b
   logging.info(f"Sum calculated successfully: {result}")
   return result

# Main program
if __name__ == "__main__":
   logging.info("Starting the program")
   result = calculate_sum(10, 20)
   logging.info("Program completed")

輸出

以下是上述程式碼的輸出 -

2024-06-19 09:00:06,774 - INFO - Starting the program
2024-06-19 09:00:06,774 - DEBUG - Calculating sum of 10 and 20
2024-06-19 09:00:06,774 - INFO - Sum calculated successfully: 30
2024-06-19 09:00:06,775 - INFO - Program completed

配置日誌記錄

在 Python 中配置日誌記錄是指設定各種元件,例如記錄器、處理器和格式化程式,以控制日誌訊息的儲存和顯示方式。此配置允許開發人員根據其應用程式的要求和部署環境自定義日誌記錄行為。

示例

在以下示例中,getLogger() 函式檢索或建立命名記錄器。記錄器根據其名稱進行分層組織。然後,建立諸如“StreamHandler”(控制檯處理器)之類的處理器以定義日誌訊息的去向。可以為它們配置特定的日誌級別和格式化程式。

格式化程式指定日誌記錄的佈局,確定列印或儲存日誌訊息時的顯示方式 -

import logging

# Create logger
logger = logging.getLogger('my_app')
logger.setLevel(logging.DEBUG)  # Set global log level

# Create console handler and set level to debug
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# Create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)

# Add console handler to logger
logger.addHandler(console_handler)

# Example usage
logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

產生的結果如下所示 -

2024-06-19 09:05:20,852 - my_app - DEBUG - This is a debug message
2024-06-19 09:05:20,852 - my_app - INFO - This is an info message
2024-06-19 09:05:20,852 - my_app - WARNING - This is a warning message
2024-06-19 09:05:20,852 - my_app - ERROR - This is an error message
2024-06-19 09:05:20,852 - my_app - CRITICAL - This is a critical message

日誌記錄處理器

Python 中的日誌記錄處理器決定日誌訊息的處理和輸出位置。它們在將日誌訊息定向到特定目標(例如控制檯、檔案、電子郵件、資料庫甚至遠端伺服器)方面發揮著重要作用。

可以獨立配置每個處理器,以控制其處理的訊息的格式、日誌級別和其他屬性。

日誌記錄處理器的型別

以下是 Python 中各種型別的日誌記錄處理器 -

  • StreamHandler - 將日誌訊息傳送到流,例如 sys.stdout 或 sys.stderr。適用於在控制檯或命令列介面中顯示日誌訊息。

  • FileHandler - 將日誌訊息寫入檔案系統上的指定檔案。適用於持久日誌記錄和日誌資料的存檔。

  • RotatingFileHandler - 類似於 FileHandler,但會根據大小或時間間隔自動輪換日誌檔案。有助於管理日誌檔案大小並防止它們變得過大。

  • SMTPHandler - 透過 SMTP 將日誌訊息作為電子郵件傳送到指定的收件人。適用於提醒管理員或開發人員有關關鍵問題。

  • SysLogHandler - 將日誌訊息傳送到類 Unix 系統上的系統日誌(例如,syslog)。允許與系統範圍的日誌記錄功能整合。

  • MemoryHandler - 在記憶體中緩衝日誌訊息,並在達到特定緩衝區大小或超時後將其傳送到目標處理器。適用於批處理和管理突發日誌訊息。

  • HTTPHandler - 透過 HTTP 或 HTTPS 將日誌訊息傳送到 Web 伺服器。能夠將日誌訊息記錄到遠端伺服器或日誌記錄服務。

廣告