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壓力和提高獲取錯誤日誌資訊的效率。- 日誌級別的指定通常都是在應用程式的配置檔案中進行指定的。
- 不同的應用程式所定義的日誌等級會有所差別,根據實際需求來決定。
參考: