Python中logging例項講解

2022-10-04 18:21:10 字數 2062 閱讀 6278

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例項講解

本文位址: /jiaoben/python/250290.html

Python中logging的使用

我們先來看一下函式式簡單配置 預設情況下python的logging模組將日誌列印到了標準輸出中,且只顯示了大於等於warning級別的日誌,這說明預設的日誌級別設定為warning 日誌級別等級critical error warning info debug 預設的日誌格式為日誌級別 logge...

python中的logging模組

一 python中的logging模組提供了日誌的介面,過它儲存各種格式的日誌 日誌的等級分為以下幾種,日誌的等級按照以下順序依次提高,debug info warning error critical 但是日誌的資訊量是依次減少的,當指定乙個日誌級別之後,會記錄大於或等於這個日誌級別的日誌資訊,小...

python中logging日誌模組操作

用python寫 的時候,在想看的地方寫個print xx 就能在控制台上顯示列印資訊,這樣子就能知道它是什麼了,但是當我需要看大量的地方或者在乙個檔案中檢視的時候,這時候print就不大方便了,所以python引入了logging模組來記錄我想要的資訊。import logging 引入loggi...