『無為則無心』Python日誌 — 64、Python日誌模組logging介紹
- 2022 年 3 月 4 日
- 筆記
- 高級測試技能 - Python基礎
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
設置的level
是Info
,記錄時使用的logger.debug
,那麼就會不滿足,所以不會記錄日誌。
2、查看logger
的filter
過濾器是否滿足。
3、filter
通過之後,交給logger
的handler
來記錄日誌,一個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 |
嚴重的錯誤,表明程式已不能繼續運行了。 |
說明:
- 上面列表中的日誌等級是從上到下依次升高的,即:
DEBUG
<INFO
<WARNING
<ERROR
<CRITICAL
。而日誌的資訊量是依次減少的。 - 當為某個應用程式指定一個日誌級別後,應用程式會記錄所有日誌級別大於或等於指定日誌級別的日誌資訊,而不是僅僅記錄指定級別的日誌資訊,小於該等級的日誌記錄將會被丟棄。
總結:
- 開發應用程式時或部署開發環境時,可以使用
DEBUG
或INFO
級別的日誌獲取儘可能詳細的日誌資訊,可以方便進行開發或部署調試。- 應用上線或部署生產環境時,應用使用
WARNING
或ERROR
或CRITICAL
級別的日誌,來降低機器的I/O壓力和提高獲取錯誤日誌資訊的效率。- 日誌級別的指定通常都是在應用程式的配置文件中進行指定的。
- 不同的應用程式所定義的日誌等級會有所差別,根據實際需求來決定。
參考: