本文目錄一覽:
- 1、python logging 使用記錄:設置INFO級別不生效,格式化,輸出到文件
- 2、Loguru:優雅的Python程序日誌
- 3、Python日誌模塊介紹
- 4、python logging繼承關係
- 5、Python日誌—Python日誌模塊logging介紹
python logging 使用記錄:設置INFO級別不生效,格式化,輸出到文件
沒有輸出INFO的日誌級別。默認是WARN級別的日誌,這裡沒有輸出WARN說明沒有設置成功。
這時可以正常輸出INFO了
此時第二個logger也被設置了INFO級別了,查看源碼:
可以看到名字為None時返回的是一個root對象,這也是為什麼第二個logger也被修改的原因。
常見的輸出到控制台和文件
默認只是輸出了message,這樣子還不如直接用print()函數了。所以還需要格式化一下:
設置格式化要用到logging.Handler
輸出效果:
[圖片上傳失敗…(image-6690c5-1606835078864)]
formatter參數 :
Loguru:優雅的Python程序日誌
不同的日誌等級,輸出效果也不一樣(等級由低到高是 DEBUG 、 INFO 、 WARNING 、 ERROR 、 CRITICAL )
add() 函數用於註冊“沉量” sink ,用於管理日誌消息。
將上面兩個功能合起來,就能實現最基本的日誌功能了。
可以用 rotation 、 retention 、 compression 進行日誌窗口、更新、壓縮管理。
loguru支持 f-string :
使用 backtrace 、 diagnose
參考:
Python日誌模塊介紹
logging 模塊預定義了5種日誌級別,並根據它們所跟蹤的事件的級別或嚴重程度來命名,具體如下:
注意:
Logger 對象有三個功能:
Logger 對象的使用最廣泛的方法主要是:配置和記錄消息
當配置了 Logger 對象後,就可以使用 Logger.debug() , Logger.info() , Logger.warning , Logger.error , Logger.critical() 方法來創建日誌消息,只需將需要記錄的消息寫進括號內即可
Handler 對象負責將日誌消息(基於日誌消息的嚴重性)分派給處理器的指定目標。在上一步中提到,可以使用 Logger.addHandler() 來添加零個或多個處理器對象。例如,算法可以將所有日誌消息都發送到控制台,將 ERROR 或者更高級別的消息發送到磁盤文件。這就需要兩個單獨的處理器。
處理器有很多 種類 ,常用的主要有以下幾種:
Formatter 對象是用來配置日誌消息的最終輸出形式。其格式由 %(dictionary key)s 這樣的表達形式來組合成字符串。例如:
其中,可以設置的dictionary key可參考 LogRecord屬性
配置完後,我們就可以在我們算法想要進行日誌記錄的地方調用 Logger.debug() , Logger.info() , Logger.warning , Logger.error , Logger.critical() 來進行日誌輸出了。比如:
當運行算法時,你會看到控制台輸出以下內容
python logging繼承關係
這篇文章主要解析python logging模塊不同logger間日誌級別的繼承關係,以及日誌輸出的機制。
在python的logging模塊中,通過 logging.getLogger() 函數可以獲取到指定的logger,如果沒有指定參數, 那麼返回的是root logger. 通過指定不同的logger名稱,這個函數可以返回指定的logger.這裡,logger名字 本身體現了logger的繼承關係,它通過”.”分隔父logger和子logger,可以存在很多個”.”,他們一路繼承下來。
如”a.b”這個logger存在一個父logger”a”, 而”a”則從root logger繼承而來。如下圖所示:
每個logger下面可能存在0個或多個handler,handler實現日誌的輸出,每個handler對應一個輸出目標。 通過配置多個handler,可以實現同時輸出到文件,控制台的功能。 同時,每個handler可以定製日誌級別,從而使得某些日誌級別可以只輸出到文件中,而不輸出到控制台。
每個logger都可以設置日誌級別,如果沒有設置,默認是NOSET。當logger的日誌級別是NOSET時,它會按照繼承關係向上層獲取日誌級別, 直到日誌級別不是NOSET,或達到root logger為止。如以上關係,
這個機制在 官方文檔setLevel 中有詳細介紹。
logger中,有一個字段 propagate ,這個字段用於控制是否 繼承父logger的handler,默認是繼承。
當這個選項打開時,logger除了將日誌寫入自身的handler外,還會將日誌寫入祖先的handler中。
假設我們往a.b這個logger寫入一條日誌,其過程如下:
這裡需要注意的是,logger的日誌級別用於在入口處過濾,handler用於出口處過濾,在propagate的時候,已經過了輸入階段,到達輸出階段, 不需要再判斷上層logger的日誌級別,只判斷handler的級別是否滿足。
轉自:
Python日誌—Python日誌模塊logging介紹
從事與軟件相關工作的人,應該都聽過“日誌”一詞。
日誌就是跟蹤軟件運行時事件的方法,為了能夠在程序運行過程中記錄錯誤。
通過日誌記錄程序的運行,方便我們查詢信息,以便追蹤問題、進行維護和調試、還是數據分析。
並且各編程語言都形成了各自的日誌體系和相應的框架。
日誌的作用總結:
首先我們要樹立一個觀點,那就是“不是為了記錄日誌而記錄日誌,日誌也不是隨意記的”。要實現能夠只通過日誌文件還原整個程序執行的過程,達到能透明地看到程序里執行情況,每個線程每個過程到底執行結果的目的。日誌就像飛機的黑匣子一樣,應當能夠復原異常的整個現場乃至細節。
在項目中,日誌這個功能非常重要,我們要重視起來。
在Python中,使用logging模塊來進行日誌的處理。
logging是Python的內置模塊,主要用於將日誌信息進行格式化內容輸出,可將格式化內容輸出到文件,也可輸出到屏幕。
我們在開發過程中,常用print()函數來進行調試,但是在實際應用的部署時,我們要將日誌信息輸出到文件中,方便後續查找以及備份。
在我們使用日誌管理時,我們也可以將日誌格式化成Json對象轉存到ELK中方便圖形化查看及管理。
logging模塊將日誌系統從高向低依次定義了四個類,分別是logger(日誌器)、handler(處理器)、filter(過濾器)和formatter(格式器)。其中由日誌器生成的實例將接管原本日誌記錄函數logging.log的功能。
說明:
我們先來思考下下面的兩個問題:
在軟件開發階段或部署開發環境時,為了儘可能詳細的查看應用程序的運行狀態來保證上線後的穩定性,我們可能需要把該應用程序所有的運行日誌全部記錄下來進行分析,這是非常耗費機器性能的。
當應用程序正式發布或在生產環境部署應用程序時,我們通常只需要記錄應用程序的異常信息、錯誤信息等,這樣既可以減小服務器的I/O壓力,也可以避免我們在排查故障時被淹沒在日誌的海洋里。
那麼怎樣才能在不改動應用程序代碼的情況下,根據事件的重要性或者稱之為等級,實現在不同的環境中,記錄不同詳細程度的日誌呢?
這就是日誌等級的作用了,我們通過配置文件指定我們需要的日誌等級就可以了。
說明:
總結:
開發應用程序時或部署開發環境時,可以使用DEBUG或INFO級別的日誌獲取儘可能詳細的日誌信息,可以方便進行開發或部署調試。 應用上線或部署生產環境時,應用使用WARNING或ERROR或CRITICAL級別的日誌,來降低機器的I/O壓力和提高獲取錯誤日誌信息的效率。 日誌級別的指定通常都是在應用程序的配置文件中進行指定的。 不同的應用程序所定義的日誌等級會有所差別,根據實際需求來決定。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/283080.html