『無為則無心』Python日誌 — 64、Python日誌模組logging介紹

繁華似錦Fighting發表於2022-03-04

1、日誌的作用

從事與軟體相關工作的人,應該都聽過“日誌”一詞。

日誌就是跟蹤軟體執行時事件的方法,為了能夠在程式執行過程中記錄錯誤。

通過日誌記錄程式的執行,方便我們查詢資訊,以便追蹤問題、進行維護和除錯、還是資料分析。

並且各程式語言都形成了各自的日誌體系和相應的框架。

日誌的作用總結:

  • 程式除錯。
  • 瞭解軟體程式執行情況是否正常。
  • 軟體程式執行故障分析與問題定位。

2、為什麼需要寫日誌

首先我們要樹立一個觀點,那就是“不是為了記錄日誌而記錄日誌,日誌也不是隨意記的”。要實現能夠只通過日誌檔案還原整個程式執行的過程,達到能透明地看到程式裡執行情況,每個執行緒每個過程到底執行結果的目的。日誌就像飛機的黑匣子一樣,應當能夠復原異常的整個現場乃至細節。

在專案中,日誌這個功能非常重要,我們要重視起來。

  • 我們要知道日誌能用來幹什麼,能幹到什麼程度。
  • 要知道日誌框架的使用方法和配置方式。
  • 要知道什麼地方該進行日誌記錄。
  • 要知道進行什麼級別的日誌記錄。
  • 日誌中該寫些什麼內容。

3、Python中的日誌處理

(1)logging模組介紹

在Python中,使用logging模組來進行日誌的處理。

logging是Python的內建模組,主要用於將日誌資訊進行格式化內容輸出,可將格式化內容輸出到檔案,也可輸出到螢幕。

我們在開發過程中,常用print()函式來進行除錯,但是在實際應用的部署時,我們要將日誌資訊輸出到檔案中,方便後續查詢以及備份。

在我們使用日誌管理時,我們也可以將日誌格式化成Json物件轉存到ELK中方便圖形化檢視及管理。

(2)logging模組的四大元件

logging模組將日誌系統從高向低依次定義了四個類,分別是logger(日誌器)、handler(處理器)、filter(過濾器)和formatter(格式器)。其中由日誌器生成的例項將接管原本日誌記錄函式logging.log的功能。

元件 說明
logger 提供應用程式程式碼直接使用的介面。
handler 用於將日誌記錄傳送到指定的目的位置。
formatter 用於控制日誌資訊的最終輸出格式,格式化輸出。
filter 提供更細粒度的日誌過濾功能,用於決定哪些日誌記錄將會被輸出(其它的日誌記錄將會被忽略)。

說明:

  • Logger:用於記錄日誌的物件。
    工作流程如下:
    1、判斷需要記錄的日誌level是否滿足當前logger物件設定的level等級要求。
    比如logger設定的levelInfo,記錄時使用的logger.debug,那麼就會不滿足,所以不會記錄日誌。
    2、檢視loggerfilter過濾器是否滿足。
    3、filter通過之後,交給loggerhandler來記錄日誌,一個logger是可以設定多個handler
    注意:在整個應用中可以有多個logger,使用logging.getLogger時通過指定name來獲取物件,實際logging中還存在一個Manager類,由Manager來進行多logger的單例模式管理。
  • Handler:用於記錄日誌到具體的檔案、輸出流或其他的管道。
    功能如下:
    1、檢視記錄日誌是否滿足過濾器。
    2、滿足過濾器,按照設定的Formatter生成字串。
    3、將內容寫入到具體的檔案或者輸出流
    不同的Handler可能有不同的處理,但是底層原理還是做這三件事情。

(3)logging日誌級別

我們先來思考下下面的兩個問題:

  • 作為開發人員,在開發一個應用程式時需要什麼日誌資訊?在應用程式正式上線後需要什麼日誌資訊?
  • 作為應用運維人員,在部署開發環境時需要什麼日誌資訊?在部署生產環境時需要什麼日誌資訊?

在軟體開發階段或部署開發環境時,為了儘可能詳細的檢視應用程式的執行狀態來保證上線後的穩定性,我們可能需要把該應用程式所有的執行日誌全部記錄下來進行分析,這是非常耗費機器效能的。

當應用程式正式釋出或在生產環境部署應用程式時,我們通常只需要記錄應用程式的異常資訊、錯誤資訊等,這樣既可以減小伺服器的I/O壓力,也可以避免我們在排查故障時被淹沒在日誌的海洋裡。

那麼怎樣才能在不改動應用程式程式碼的情況下,根據事件的重要性或者稱之為等級,實現在不同的環境中,記錄不同詳細程度的日誌呢?

這就是日誌等級的作用了,我們通過配置檔案指定我們需要的日誌等級就可以了。

級別 何時使用
DEBUG 細節資訊,僅當診斷問題時適用。
INFO 確認程式按預期執行。
WARNING 表明發生了一些意外,或者不久的將來會發生問題(如‘磁碟滿了’)。但程式還是在正常工作。
ERROR 由於嚴重的問題,程式的某些功能已經不能正常執行。
CRITICAL 嚴重的錯誤,表明程式已不能繼續執行了。

說明:

  • 上面列表中的日誌等級是從上到下依次升高的,即:DEBUGINFOWARNINGERRORCRITICAL。而日誌的資訊量是依次減少的。
  • 當為某個應用程式指定一個日誌級別後,應用程式會記錄所有日誌級別大於或等於指定日誌級別的日誌資訊,而不是僅僅記錄指定級別的日誌資訊,小於該等級的日誌記錄將會被丟棄。

總結:

  • 開發應用程式時或部署開發環境時,可以使用DEBUGINFO級別的日誌獲取儘可能詳細的日誌資訊,可以方便進行開發或部署除錯。
  • 應用上線或部署生產環境時,應用使用WARNINGERRORCRITICAL級別的日誌,來降低機器的I/O壓力和提高獲取錯誤日誌資訊的效率。
  • 日誌級別的指定通常都是在應用程式的配置檔案中進行指定的。
  • 不同的應用程式所定義的日誌等級會有所差別,根據實際需求來決定。

參考:

相關文章