最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

假設我們在主程序中也有一個 Logger,調用 peewee 后,我想將兩個日志輸出到同一個日志文件中去。顯然將兩個日志的 FileHandler 指向同一個日志文件是不可取的,存在并發(fā)搶占文件的風險。當然我們也可以將主程序中的 Logger 名字定為 peewee,但這不僅太 low 了,而且如果再調用一個庫,其中也封裝好了一個 Logger,就不好處理了。

樹樁結構的 Logger

Logger 對象被設計為一個樹形結構,它有一個 parent 屬性。logging 中定義了一個名為 root 的 Logger 作為所有 Logger 的根節(jié)點,root 的 parent 屬性為 None。root 是全局的。

當調用

logging.getLogger(name=None)

得到一個 Logger 對象的時候,如果 name 為 None,則返回根節(jié)點 root。如果 name 中含有 .,比如 name = 'a.b',這時如果已經存在了名為 a 的 Logger,則 a.b 為 a 的子節(jié)點,如果不存在名為 a 的 Logger,則 a.b 為 root 的子節(jié)點。

child logger 在完成對日志消息的處理后,默認會將日志消息傳遞給與它的 parent logger。因此,我們不必為一個應用程序中使用的所有 Logger 定義和配置 handlers,只需要為一個頂層的 Logger 配置 handlers,然后按照需要創(chuàng)建 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 的子節(jié)點,并且 logB 中也定義了 Handler,所以 logB 的 Handler 輸出了一次,logA 的 Handler 也輸出了一次,就 2 次了。如果想只輸出一次,可以刪掉 logB 中的 Handler。當然,這也是有用處的,尤其是當你手頭沒有日志管理工具的時候。例如,主程序中需要輸出所有的日志,以便了解程序整體的運行順序,而某模塊的日志,你想單獨輸出一份,以便清晰了解模塊中的報錯或者是執(zhí)行順序。

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

結語

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

相關文章

  • python append、extend與insert的區(qū)別

    python append、extend與insert的區(qū)別

    這篇文章主要介紹了python append、extend與insert的區(qū)別的相關資料,初學者對這幾個概念經常搞混,這里就幫大家理清楚,需要的朋友可以參考下
    2016-10-10
  • Python pickle模塊實現(xiàn)對象序列化

    Python pickle模塊實現(xiàn)對象序列化

    這篇文章主要介紹了Python pickle模塊實現(xiàn)對象序列化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • windows下python之mysqldb模塊安裝方法

    windows下python之mysqldb模塊安裝方法

    這篇文章主要介紹了windows下python之mysqldb模塊安裝方法,需要的朋友可以參考下
    2017-09-09
  • 對Python中內置異常層次結構詳解

    對Python中內置異常層次結構詳解

    今天小編就為大家分享一篇對Python中內置異常層次結構詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python datetime和unix時間戳之間相互轉換的講解

    Python datetime和unix時間戳之間相互轉換的講解

    今天小編就為大家分享一篇關于Python datetime和unix時間戳之間相互轉換的講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Python中Threading用法詳解

    Python中Threading用法詳解

    本篇文章給大家介紹了Python中Threading的詳細用法,需要的朋友跟著小編一起學習下吧。
    2017-12-12
  • 在Python Flask App中獲取已發(fā)布的JSON對象的解決方案

    在Python Flask App中獲取已發(fā)布的JSON對象的解決方案

    這篇文章主要介紹了在Python Flask App中獲取已發(fā)布的JSON對象的解決方案,文中通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • 對python中的xlsxwriter庫簡單分析

    對python中的xlsxwriter庫簡單分析

    今天小編就為大家分享一篇對python中的xlsxwriter庫簡單分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python實現(xiàn)簡單的2048小游戲

    Python實現(xiàn)簡單的2048小游戲

    這篇文章主要為大家詳細介紹了Python實現(xiàn)簡單的2048小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 將python字符串轉化成長表達式的函數(shù)eval實例

    將python字符串轉化成長表達式的函數(shù)eval實例

    這篇文章主要介紹了將python字符串轉化成長表達式的函數(shù)eval實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05

最新評論

久治县| 丹棱县| 保德县| 江安县| 丹凤县| 广安市| 英超| 凉山| 阳谷县| 德钦县| 江安县| 雷山县| 姚安县| 张北县| 葵青区| 天台县| 平安县| 府谷县| 鄯善县| 中超| 延津县| 岐山县| 含山县| 卢湾区| 巴中市| 舟曲县| 遵义县| 雷波县| 车致| 宜兰县| 高陵县| 象山县| 冀州市| 沂南县| 浦北县| 芦山县| 射阳县| 侯马市| 高陵县| 琼结县| 砀山县|