欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統(tǒng) 1686 0

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

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

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

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

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

Python中l(wèi)ogging實(shí)例講解_第1張圖片

假設(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è)庫(kù),其中也封裝好了一個(gè) Logger,就不好處理了。

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

Logger 對(duì)象被設(shè)計(jì)為一個(gè)樹(shù)形結(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 就可足夠了。我們可以通過(guò)設(shè)置 Logger 的 propagate 屬性設(shè)置為 False 來(lái)關(guān)閉這種傳遞機(jī)制。

什么意思呢,我們來(lái)看代碼:

            
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)你手頭沒(méi)有日志管理工具的時(shí)候。例如,主程序中需要輸出所有的日志,以便了解程序整體的運(yùn)行順序,而某模塊的日志,你想單獨(dú)輸出一份,以便清晰了解模塊中的報(bào)錯(cuò)或者是執(zhí)行順序。

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

結(jié)語(yǔ)

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日韩国产欧美在线观看 | 国产99视频在线 | 日韩视频二区 | 欧美xxxxx69xxxx | 国产欧美一区二区三区精品 | 欧美午夜一区二区三区免费大片 | 亚洲免费视 | 久久99色 | 国产区一区| 日本高清在线精品一区二区三区 | 午夜精品久久久久久91 | 99精品影视 | 亚洲一区中文字幕 | 亚洲精品国产第一区二区多人 | 国产精品毛片久久久久久 | 天天射天天添 | 色综合久久88色综合天天 | 99久久精品国产免看国产一区 | 久久久久久免费播放一级毛片 | 亚洲国产精品久久久久久网站 | 欧美精品国产精品 | 在线观看免费av网 | 97超精品视频在线观看 | 国产激情在线观看 | 亚洲精品乱码久久久久久v 国产高清免费视频 | 色综合色综合 | 国产美女一区二区 | 国产精品精品视频一区二区三区 | 女人被添全过程A片久久AV | 国产免费叼嘿在线观看 | 国产一区二区三区不卡在线观看 | 国产成人a亚洲精品 | 波多野衣结在线精品二区 | 午夜理论电影在线观看亚洲 | 亚洲aⅴ天堂av在线电影软件 | 欧美精品一区二区在线观看 | 激情六月丁香婷婷 | 欧美精彩视频在线观看 | 欧美精品午夜久久久伊人 | 国产一区二区免费 | 久久综合久久综合久久综合 |