首頁 > 後端開發 > Python教學 > Python中logging的詳細介紹(附範例)

Python中logging的詳細介紹(附範例)

不言
發布: 2019-01-17 11:20:27
轉載
2694 人瀏覽過

這篇文章帶給大家的內容是關於Python中logging的詳細介紹(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

引言

logging 的基本用法網路上很多,這裡就不介紹了。在引入正文之前,先來看一個需求:

假設需要將某功能封裝成類別庫供他人使用,如何處理類別庫中的日誌?

幾年前在一個 C# 開發的專案中,我用了這樣的方法:定義一個 logging 基類,所有需要用到日誌的類別都繼承這個基類,這個基類中定義一個 LogHandler 事件,該事件用於實現具體的記錄日誌動作,同時可以透過將類別 A 的 LogHandler 委託掛到類別 B 的 LogHandler 上,實作將兩個類別的日誌資訊加入在一起。

自從看了 python 中 logging 的實作方式,我發現我的做法真是弱爆了。

我在先前的部落格Python:logging.NullHandler 的使用中介紹了peewee 框架中的日誌輸出,簡單來說就是peewee 中定義了一個名為peewee 的Logger 並添加了一個NullHandler,調用者只需要為其添加具體的Handler 就可以輸出日誌了,非常方便。


假設我們在主程式中也有一個 Logger,呼叫 peewee 後,我想將兩個日誌輸出到同一個日誌檔案中去。顯然將兩個日誌的 FileHandler 指向同一個日誌檔案是不可取的,存在並發搶佔檔案的風險。當然我們也可以將主程式中的 Logger 名字定為 peewee,但這不僅太 low 了,而且如果再呼叫一個函式庫,其中也封裝好了一個 Logger,就不好處理了。

樹樁結構的 Logger

Logger 物件被設計為一個樹狀結構,它有一個 parent 屬性。 logging 中定義了一個名為 root 的 Logger 作為所有 Logger 的根節點,root  的 parent 屬性為 None。 root 是全域的。

當呼叫

logging.getLogger(name=None)
登入後複製

得到一個 Logger 物件的時候,如果 name 為 None,則傳回根節點 root。如果name 中含有.,例如name = 'a.b',這時如果已經存在了名為a 的Logger,則a.b 為a 的子節點,如果不存在名為a 的Logger,則a.b 為root 的子節點。

child logger 在完成對日誌訊息的處理後,預設會將日誌訊息傳遞給與它的 parent logger。因此,我們不必為一個應用程式中使用的所有 Logger 定義和配置 handlers,只需要為一個頂層的 Logger 配置 handlers,然後按照需要建立 child loggers 就足夠了。我們可以透過設定 Logger 的 propagate 屬性來設定為 False 來關閉這種傳遞機制。

什麼意思呢,我們來看程式碼:

import logging
logA = logging.getLogger('a')
logA.setLevel(logging.DEBUG)
logA.addHandler(logging.StreamHandler())
logB = logging.getLogger('a.b')
logB.addHandler(logging.StreamHandler())
登入後複製

輸出結果:

Logger A
Logger B
Logger B
登入後複製

之所以Logger B 被輸出了2 次,是因為logB 是logA 的子節點,而logB 中也定義了Handler,所以logB 的Handler 輸出了一次,logA 的Handler 也輸出了一次,就2 次了。如果您想只輸出一次,可以刪掉 logB 中的 Handler。當然,這也是有用處的,尤其是當你手邊沒有日誌管理工具的時候。例如,主程式中需要輸出所有的日誌,以便了解程式整體的運作順序,而某模組的日誌,你想單獨輸出一份,以便清晰了解模組中的報錯或是執行順序。

之前 peewee 的範例也就很容易解決了,只需要將 peewee 日誌的 parent 屬性設定為主程式的日誌就可以了。

結語

其實這是比較容易說明的問題,完全沒必要寫這麼多。我並不想跟大家分享 python 中的 logging 是怎麼用的,而是想和大家分享 logging 如此實現的一種思想,因為我遇到過這個問題,也設計了解決方案,然後被完爆了。

以上是Python中logging的詳細介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:cnblogs.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板