天天看點

Python日志—Python日志子產品logging介紹

作者:運維老男孩

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

參考:

https://www.imooc.com/article/286439?tdsourcetag=s_pctim_aiomsg

https://www.cnblogs.com/Nicholas0707/p/9021672.html

https://www.cnblogs.com/mayi0312/p/11075706.html

https://blog.csdn.net/weixin_43063753/article/details/82899395

原文位址:https://www.cnblogs.com/liuyuelinfighting/p/15963454.html