欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python中l(wèi)ogging實(shí)例講解

 更新時(shí)間:2019年01月17日 15:49:09   投稿:laozhang  
在本篇文章里小編給大家分享的是關(guān)于Python中l(wèi)ogging的詳細(xì)介紹內(nèi)容,有興趣的朋友們跟著學(xué)習(xí)下。

logging 的基本用法網(wǎng)上很多,這里就不介紹了。在引入正文之前,先來看一個(gè)需求:

假設(shè)需要將某功能封裝成類庫供他人使用,如何處理類庫中的日志?

數(shù)年前在一個(gè) C# 開發(fā)的項(xiàng)目中,我用了這樣的方法:定義一個(gè) logging 基類,所有需要用到日志的類都繼承這個(gè)基類,這個(gè)基類中定義一個(gè) LogHandler 事件,該事件用于實(shí)現(xiàn)具體的記錄日志動(dòng)作,同時(shí)可以通過將類 A 的 LogHandler 委托掛到類 B 的 LogHandler 上,實(shí)現(xiàn)將兩個(gè)類的日志信息添加到一起。

自從看了 python 中 logging 的實(shí)現(xiàn)方式,我發(fā)現(xiàn)我的做法真是弱爆了。

我在之前的博客 Python:logging.NullHandler 的使用 中介紹了 peewee 框架中的日志輸出,簡單來說就是 peewee 中定義了一個(gè)名為peewee 的 Logger 并添加了一個(gè) NullHandler,調(diào)用者只需要為其添加具體的 Handler 就可以輸出日志了,非常方便。

假設(shè)我們?cè)谥鞒绦蛑幸灿幸粋€(gè) Logger,調(diào)用 peewee 后,我想將兩個(gè)日志輸出到同一個(gè)日志文件中去。顯然將兩個(gè)日志的 FileHandler 指向同一個(gè)日志文件是不可取的,存在并發(fā)搶占文件的風(fēng)險(xiǎn)。當(dāng)然我們也可以將主程序中的 Logger 名字定為 peewee,但這不僅太 low 了,而且如果再調(diào)用一個(gè)庫,其中也封裝好了一個(gè) Logger,就不好處理了。

樹樁結(jié)構(gòu)的 Logger

Logger 對(duì)象被設(shè)計(jì)為一個(gè)樹形結(jié)構(gòu),它有一個(gè) parent 屬性。logging 中定義了一個(gè)名為 root 的 Logger 作為所有 Logger 的根節(jié)點(diǎn),root 的 parent 屬性為 None。root 是全局的。

當(dāng)調(diào)用

logging.getLogger(name=None)

得到一個(gè) Logger 對(duì)象的時(shí)候,如果 name 為 None,則返回根節(jié)點(diǎn) root。如果 name 中含有 .,比如 name = 'a.b',這時(shí)如果已經(jīng)存在了名為 a 的 Logger,則 a.b 為 a 的子節(jié)點(diǎn),如果不存在名為 a 的 Logger,則 a.b 為 root 的子節(jié)點(diǎn)。

child logger 在完成對(duì)日志消息的處理后,默認(rèn)會(huì)將日志消息傳遞給與它的 parent logger。因此,我們不必為一個(gè)應(yīng)用程序中使用的所有 Logger 定義和配置 handlers,只需要為一個(gè)頂層的 Logger 配置 handlers,然后按照需要?jiǎng)?chuàng)建 child loggers 就可足夠了。我們可以通過設(shè)置 Logger 的 propagate 屬性設(shè)置為 False 來關(guān)閉這種傳遞機(jī)制。

什么意思呢,我們來看代碼:

import logging
logA = logging.getLogger('a')
logA.setLevel(logging.DEBUG)
logA.addHandler(logging.StreamHandler())
logB = logging.getLogger('a.b')
logB.addHandler(logging.StreamHandler())

輸出結(jié)果:

Logger A
Logger B
Logger B

之所以 Logger B 被輸出了 2 次,是因?yàn)?logB 是 logA 的子節(jié)點(diǎn),并且 logB 中也定義了 Handler,所以 logB 的 Handler 輸出了一次,logA 的 Handler 也輸出了一次,就 2 次了。如果想只輸出一次,可以刪掉 logB 中的 Handler。當(dāng)然,這也是有用處的,尤其是當(dāng)你手頭沒有日志管理工具的時(shí)候。例如,主程序中需要輸出所有的日志,以便了解程序整體的運(yùn)行順序,而某模塊的日志,你想單獨(dú)輸出一份,以便清晰了解模塊中的報(bào)錯(cuò)或者是執(zhí)行順序。

之前 peewee 的例子也就很容易解決了,只需要將 peewee 日志的 parent 屬性設(shè)置為主程序的日志就可以了。

結(jié)語

其實(shí)這是一個(gè)比較容易說明的問題,完全沒必要寫這么多。我并不想跟大家分享 python 中的 logging 是怎么用的,而是想和大家分享 logging 如此實(shí)現(xiàn)的一種思想,因?yàn)槲矣龅竭^這個(gè)問題,也設(shè)計(jì)了解決方案,然后被完爆了。

相關(guān)文章

  • Python的條件控制?if?語句詳解

    Python的條件控制?if?語句詳解

    Python的?if?語句用來「控制代碼」的執(zhí)行,「判斷條件成立」時(shí)執(zhí)行一段代碼,判斷條件「不成立」時(shí)執(zhí)行另一段代碼,本文就給大家詳細(xì)講講Python的條件控制?if?語句,需要的朋友可以參考下
    2023-08-08
  • 解決Jupyter Notebook開始菜單欄Anaconda下消失的問題

    解決Jupyter Notebook開始菜單欄Anaconda下消失的問題

    這篇文章主要介紹了解決Jupyter Notebook開始菜單欄Anaconda下消失的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 數(shù)據(jù)清洗之如何用一行Python代碼去掉文本中的各種符號(hào)

    數(shù)據(jù)清洗之如何用一行Python代碼去掉文本中的各種符號(hào)

    我們?cè)谔幚砦谋镜臅r(shí)候往往需要對(duì)標(biāo)點(diǎn)符號(hào)進(jìn)行處理,下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)清洗之如何用一行Python代碼去掉文本中的各種符號(hào)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Django框架models使用group by詳解

    Django框架models使用group by詳解

    這篇文章主要介紹了Django框架models使用group by詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Python新手如何理解循環(huán)加載模塊

    Python新手如何理解循環(huán)加載模塊

    在本篇文章里小編給大家整理了關(guān)于Python新手如何理解循環(huán)加載模塊相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。
    2020-05-05
  • python中的pygame實(shí)現(xiàn)接球小游戲

    python中的pygame實(shí)現(xiàn)接球小游戲

    這篇文章主要介紹了python中的pygame實(shí)現(xiàn)接球小游戲,文章基于python的相關(guān)資料展開詳細(xì)的內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-04-04
  • Python3 解決讀取中文文件txt編碼的問題

    Python3 解決讀取中文文件txt編碼的問題

    今天小編就為大家分享一篇Python3 解決讀取中文文件txt編碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python環(huán)境安裝配置實(shí)用的提示

    Python環(huán)境安裝配置實(shí)用的提示

    想要使用Python語言編寫程序,我們必須下載Python安裝包并配置Python環(huán)境,這篇文章主要給大家介紹了關(guān)于Python環(huán)境安裝配置實(shí)用提示的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 關(guān)于python實(shí)現(xiàn)常用的相似度計(jì)算方法

    關(guān)于python實(shí)現(xiàn)常用的相似度計(jì)算方法

    這篇文章主要介紹了關(guān)于python實(shí)現(xiàn)常用的相似度計(jì)算方法,最初的相似度計(jì)算是為了表征向量的重合程度的,在這里最經(jīng)典的就是余弦相似度了,當(dāng)然使用正弦或者是正切等等三角函數(shù)也都是可以的,需要的朋友可以參考下
    2023-07-07
  • Python 玩轉(zhuǎn)圖像格式轉(zhuǎn)換操作

    Python 玩轉(zhuǎn)圖像格式轉(zhuǎn)換操作

    這篇文章主要介紹了Python 玩轉(zhuǎn)圖像格式轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評(píng)論