Python - 錄 log
大家好,有志於成為 Python 程式設計師的你!今天,我們將深入 Python 的 log 記錄世界。身為你友善的電腦教師,我很興奮能夠引導你走過這段旅程。相信我,到了這篇教學的結尾,你將能像專家一樣進行 log 記錄!
Python 中的 Log 記錄
想像你是一位正在嘗試解開謎團的偵探。你會想要記錄下所有你找到的線索,對吧?這正是程式設計中 log 記錄的作用!它幫助我們跟蹤代碼運行時發生了什麼。
Python 提供了一個內建的 logging
模組,使這個過程變得輕鬆。它就像一本值得信賴的筆記本,會自動為你記錄下重要的資訊。
Log 記錄的好處
現在,你可能在想,“當我可以使用 print 語句時,為什麼要麻煩使用 log 記錄?”這是一個好問題!讓我跟你分享一些我早期編程時的故事。
我以前花費了數小時使用 print 語句除錯。那就像在乾草堆中尋找一根針一樣!那時我發現了 log 記錄的魔力。以下是一些好處:
- 靈活性:與 print 語句不同,logs 可以在不修改代碼的情況下輕鬆地開啟或關閉。
- 嚴重性等級:你可以根據它們的重要性對 logs 進行分類。
- 輸出控制:Logs 可以被導向到文件、控制台,甚至遠程伺服器!
- 性能:與 print 語句相比,log 記錄對性能的影響較小。
Python Log 記錄的組件
讓我們來分解 Python log 記錄的主要組件:
- Loggers:這些是進入 log 系統的入口點。
- Handlers:他們將 log 記錄發送到合適的目的地。
- Formatters:他們指定最終輸出中 log 記錄的佈局。
- 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 訊息")
在這個例子中,我們已經:
- 將 log 等級設定為 DEBUG
- 指定了我們 log 訊息的格式
- 將輸出導向到名為 '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 訊息')
在這個例子中,我們設置了兩個處理器:
- 一個 StreamHandler 將 WARNING 及以上的訊息輸出到控制台
- 一個 FileHandler 將 ERROR 及以上的訊息記錄到文件
運行此代碼,你將在控制台看到 WARNING 及以上的訊息,而只有 ERROR 和 CRITICAL 訊息會被保存到文件中。
就是這樣,各位!你剛剛走出了 Python log 記錄世界的第一步。記住,練習成就完美。嘗試不同的配置,看看哪一個最適合你的專案。
開心 log 記錄,願你的代碼永遠無bug!
Credits: Image by storyset