Python - 錄 log

大家好,有志於成為 Python 程式設計師的你!今天,我們將深入 Python 的 log 記錄世界。身為你友善的電腦教師,我很興奮能夠引導你走過這段旅程。相信我,到了這篇教學的結尾,你將能像專家一樣進行 log 記錄!

Python - Logging

Python 中的 Log 記錄

想像你是一位正在嘗試解開謎團的偵探。你會想要記錄下所有你找到的線索,對吧?這正是程式設計中 log 記錄的作用!它幫助我們跟蹤代碼運行時發生了什麼。

Python 提供了一個內建的 logging 模組,使這個過程變得輕鬆。它就像一本值得信賴的筆記本,會自動為你記錄下重要的資訊。

Log 記錄的好處

現在,你可能在想,“當我可以使用 print 語句時,為什麼要麻煩使用 log 記錄?”這是一個好問題!讓我跟你分享一些我早期編程時的故事。

我以前花費了數小時使用 print 語句除錯。那就像在乾草堆中尋找一根針一樣!那時我發現了 log 記錄的魔力。以下是一些好處:

  1. 靈活性:與 print 語句不同,logs 可以在不修改代碼的情況下輕鬆地開啟或關閉。
  2. 嚴重性等級:你可以根據它們的重要性對 logs 進行分類。
  3. 輸出控制:Logs 可以被導向到文件、控制台,甚至遠程伺服器!
  4. 性能:與 print 語句相比,log 記錄對性能的影響較小。

Python Log 記錄的組件

讓我們來分解 Python log 記錄的主要組件:

  1. Loggers:這些是進入 log 系統的入口點。
  2. Handlers:他們將 log 記錄發送到合適的目的地。
  3. Formatters:他們指定最終輸出中 log 記錄的佈局。
  4. Filters:這些提供對輸出哪些 log 記錄的額外控制。

把它想像成工廠中的生產線。Logger 是發現問題的工人,handler 決定將報告發送到哪裡,formatter 決定報告應該是什麼樣子,而 filter 決定哪些報告重要到足以傳遞。

Log 等級

Python 的 log 記錄有五個標準的嚴重性等級。讓我們在下面的表格中看看它們:

等級 數字值 描述
DEBUG 10 详细的資訊,通常僅在診斷問題時有興趣。
INFO 20 確認事情正按照预期運行。
WARNING 30 某些意外發生,或預示著未來的某個問題。
ERROR 40 由於更嚴重的問題,軟體未能執行某些功能。
CRITICAL 50 一個嚴重的錯誤,表示程序本身可能無法繼續運行。

基本Log記錄範例

讓我們從一個簡單的例子開始:

import logging

# 設定基本 log 記錄
logging.basicConfig(level=logging.INFO)

# 創建一個 logger
logger = logging.getLogger(__name__)

# 記錄一些訊息
logger.debug("這是一個 debug 訊息")
logger.info("這是一個 info 訊息")
logger.warning("這是一個 warning 訊息")
logger.error("這是一個 error 訊息")
logger.critical("這是一個 critical 訊息")

如果你運行這段代碼,你將看到類似以下的輸出:

INFO:__main__:這是一個 info 訊息
WARNING:__main__:這是一個 warning 訊息
ERROR:__main__:這是一個 error 訊息
CRITICAL:__main__:這是一個 critical 訊息

注意到 DEBUG 訊息為什麼不會出現嗎?那是因為我們將基本配置等級設定為 INFO。任何低於 INFO 的等級(例如 DEBUG)都將不會被記錄,除非我們更改配置。

設定 Log 記錄

現在,讓我們將 log 記錄配置變得更加花哨:

import logging

# 設定 log 記錄
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
filename='app.log'
)

logger = logging.getLogger(__name__)

logger.debug("Debug 訊息")
logger.info("Info 訊息")
logger.warning("Warning 訊息")
logger.error("Error 訊息")
logger.critical("Critical 訊息")

在這個例子中,我們已經:

  1. 將 log 等級設定為 DEBUG
  2. 指定了我們 log 訊息的格式
  3. 將輸出導向到名為 'app.log' 的文件

如果你檢查 'app.log' 文件,你將看到帶有時間戳的格式化 log 訊息!

Log 處理器

處理器就像是 log 世界中的郵政服務。他們決定你的 log 訊息最終會到達哪裡。讓我們看看一個使用多個處理器的例子:

import logging

# 創建一個 logger
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

# 創建處理器
c_handler = logging.StreamHandler()  # 控制台處理器
f_handler = logging.FileHandler('file.log')  # 文件處理器
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# 創建格式化器並添加到處理器
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# 添加處理器到 logger
logger.addHandler(c_handler)
logger.addHandler(f_handler)

# 測試 logger
logger.debug('這是一個 debug 訊息')
logger.info('這是一個 info 訊息')
logger.warning('這是一個 warning 訊息')
logger.error('這是一個 error 訊息')
logger.critical('這是一個 critical 訊息')

在這個例子中,我們設置了兩個處理器:

  1. 一個 StreamHandler 將 WARNING 及以上的訊息輸出到控制台
  2. 一個 FileHandler 將 ERROR 及以上的訊息記錄到文件

運行此代碼,你將在控制台看到 WARNING 及以上的訊息,而只有 ERROR 和 CRITICAL 訊息會被保存到文件中。

就是這樣,各位!你剛剛走出了 Python log 記錄世界的第一步。記住,練習成就完美。嘗試不同的配置,看看哪一個最適合你的專案。

開心 log 記錄,願你的代碼永遠無bug!

Credits: Image by storyset