精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

神器 Logging,你真的了解嗎?

開發(fā) 前端
logging 是 python 標準模塊,用于記錄和處理程序中的日志。功能很強大,官方文檔很詳細,網(wǎng)上也有大量的說明和教程,但是對很多初次接觸的同學來說,存在一些障礙。

[[434022]]

本文轉(zhuǎn)載自微信公眾號「Python技術(shù)」,作者派森醬。轉(zhuǎn)載本文請聯(lián)系Python技術(shù)公眾號。

logging 是 python 標準模塊,用于記錄和處理程序中的日志。

功能很強大,官方文檔很詳細,網(wǎng)上也有大量的說明和教程,但是對很多初次接觸的同學來說,存在一些障礙。

一是因為標準庫文檔太過繁瑣,需要較高的理論基礎(chǔ),著急用時,常常被文檔搞暈。

二是大部分說明材料要么是官方文檔的羅列,要么是簡單的應用,對實際應用幫助不大。

今天,我們從應用上的一些問題開始,探討一下日志神器 logging 極其背后的原理,讓它能真正的幫助到我們。

該用 logging.debug 還是 logger.debug ?

debug 是日志模塊中的一個日志等級為 DEBUG 的日志生成方法,還有 info、warning、error、critial,這里用 debug 做為代表進行說明。

我們常會看到,一會兒用 logging.debug 記錄日志,一會兒又用 logger.debug 記錄日志,到底該用什么?

先看代碼:

  1. import logging 
  2.  
  3. logging.debug('調(diào)試信息'
  4.  
  5. logger = logging.getLogger() 
  6.  
  7. logger.debug('調(diào)試信息'

首先 logging 是作為一個模塊被引入的。logging.debug 用的是 logging 模塊的模塊方法。

logger 是用 logging.getLogger() 生成的,是一個 日志對象,logger.debug 調(diào)用的是 logger 這個日志對象的方法。

上面的代碼中 logging.debug 和 logger.debug 的效果完全是一樣的。

這是因為,為了讓開發(fā)者方便使用,logging 模塊提供了一些列模塊方法,如 debug,在引入模塊后,就可以直接使用。這樣開發(fā)者就不必關(guān)心日志模塊的細節(jié),像用 print 一樣輸出日志。

如果需要對日志輸出進行定制化,比如將日志輸出到文件中,過濾某些級別的日志,就需要創(chuàng)建或者得到一個實際的日志對象來處理,如上面代碼中通過 getLogger 方法得到的日志對象。

我們知道,程序設(shè)計里要避免重復的設(shè)計,如果模塊方法采用一套機制,日志對象上的方法采用另一套機制,就會出現(xiàn)重復造輪子的問題。

所以在使用模塊方法,logging 其實創(chuàng)建了一個日志對象 —— root logger。

也就是 logging.debug 這個調(diào)用,實質(zhì)上是調(diào)用 root logger 的日志方法。

相當于默認情況下 root logger 會作為日志處理對象。

如何獲得 root logger 對象呢?

通過不帶參數(shù)的 logging.getLogger() 方法獲得。

那么 logging.debug 和 rootLogger.debug 是一會事,可以理解(但不嚴謹)為 logging.debug 是 rootlogger.debug 的快捷方式。

日志樹

稍加留意就會觀察到,程序是有層次結(jié)構(gòu)的,通過相互引用,調(diào)用形成一個樹狀結(jié)構(gòu)。

程序加載的地方是樹根,比如 python 中要運行的代碼文件,我們稱之為 main。從樹根開始長出其他枝葉。對于一個模塊來說,又會形成一個自己的樹。

如何用日志清楚地記錄層次結(jié)構(gòu)呢?

雖然直接打印出調(diào)用堆棧也可以看到調(diào)用結(jié)構(gòu),不過不太直觀,缺乏業(yè)務邏輯描述。

而用 print 來打印出層次結(jié)構(gòu),需要編寫大量的代碼才能反射出(通過運行狀態(tài)獲取代碼狀態(tài)的一種方式)調(diào)用環(huán)境。

logging 提供了完畢的解決方案。

前面提到的 root logger 就是整個日志樹的根,其他所有的 logger 都是從 root logger 伸展出來的枝葉。只要通過 getLogger(loggername) 方法獲得的 logger 對象,都是伸展自 root logger 的。

如何向下伸展呢?

很簡單,就像引用模塊的層次關(guān)系一樣,用 . 分隔層次就好了,例如:

  1. logger = logging.getLogger('mod1.mod2.mod3'
  2.  
  3. logger.debug("調(diào)試信息"

語句 logging.getLogger('mod1.mod2.mod3') 實際上創(chuàng)建了三個 logger,名稱分別是 mod1、mod1.mod2 和 mod1.mod2.mod3

mod1 為根,mod1.mod2 為子,mod1.mod2.mod3 為孫。

如果在 mod1 上設(shè)置了日志處理器(handler),那么其他兩個的日志對象都會用到這個處理器。

這樣不但記錄的日志更清晰而且,可以為同一個根的日志對象設(shè)置可以共享的日志處理方式。

這樣感覺也不方便,需要些那么多層次,如何才能更方便呢?在下面的 實踐參考 里會有說明。

logging.basicConfig 的功與過

說完了日志模塊的樹狀結(jié)構(gòu),來看看一個很常用的設(shè)置方法 basicConfig。

它可以方便的設(shè)置日志處理和記錄方式,如沒必要,不用為每個日志對象單獨設(shè)置。

根據(jù)第一節(jié)的分析,我們知道,直接使用模塊方法,用的其實是 root logger,那么就能明白 basicConfig 設(shè)置了 root logger 的日志處理方式。

這就意味著:

一旦設(shè)置了通過 logging.basicConfig 設(shè)置了日志處理方式,其他所有日志都很受到影響。

另外 basicConfig 是個一次性方法,即:

只有第一次設(shè)置有效,其后設(shè)置無效

本來是個一勞永逸的方法。

但用錯了地方,就會很麻煩。

看下例子:

  1. __all__ = ['Connection''ConnectionPool''logger'
  2.  
  3. warnings.filterwarnings('error', category=pymysql.err.Warning) 
  4. # use logging module for easy debug 
  5. logging.basicConfig(format='%(asctime)s %(levelname)8s: %(message)s', datefmt='%m-%d %H:%M:%S'
  6. logger = logging.getLogger(__name__) 
  7. logger.setLevel('WARNING'

這段代碼中,用 logging.basicConfig 對日志做了設(shè)置,意思是后面的日志都按照這樣的方式輸出。

但它是一個底層模塊 —— pymysqlpool[1]。

pymysqlpool 封裝了 pymysql[2] 模塊,提供了鏈接池特性,在多線程處理數(shù)據(jù)庫場景下很有用。

也就是說,pymysqlpool 只會被引用加載,不會作為 main 被加載,這就比較尷尬了,因為 main 中對日志的設(shè)置就沒有效果。

作為一個服務類模塊(相對于業(yè)務的底層模塊),不要通過 basicConfig 來設(shè)置日志模式,要么通過自己專屬的日志對象來設(shè)置,要么不去設(shè)置,統(tǒng)一交給 main 去設(shè)置,例如:

  1. logger = logging.getLogger(__name__) 
  2.  
  3. fmt = logging.Formatter("%(asctime)s %(levelname)8s: %(message)s", datefmt='%m-%d %H:%M:%S'
  4. hdl = logging.StreamHandler() 
  5. hdl.setFormatter(fmt) 
  6. logger.addHandler(hdl) 
  7.  
  8. logger.setLevel('WARNING'

如果為了測試,可以在測試的初始化方法中,使用 basicConfig 來設(shè)置,因為測試時,模塊往往是被作為程序入庫加載的。

實踐參考

了解了日志模塊的一下特性,和其中的原理之后,這里有幾條實踐參考。

  • 不要再子模塊中使用 logging.basicConfig 設(shè)置日志模式
  • 強烈建議在任何模塊中通過 logger = logging.getLogger(__name__) 來創(chuàng)建日志對象 因為 __name__ 代表的就是模板被加載的引用名稱。

例如 from a.b.c import b 模塊 c 中的 __name__ 值就為 a.b.c。

  • 而且這個引用名稱剛好符合 logger 定義的層次結(jié)構(gòu)。

通過命令行參數(shù)設(shè)置不同類型的日志,見代碼:

  1. import logging 
  2. import argparse 
  3. logger = logging.getLogger(__name__) 
  4.  
  5. def create_args_parse(): 
  6.     parser = argparse.ArgumentParser(description="參數(shù)列表"
  7.     parser.add_argument('-d''--debug'action='store_true', help='調(diào)試模式'
  8.     # 加入其他命令行參數(shù) 
  9.          
  10.     return parser 
  11.  
  12. def set_logger(debug): 
  13.     formatter = logging.Formatter('%(asctime)s - %(levelname)8s - %(name)s - %(filename)s:%(lineno)d - %(thread)d- %(funcName)s:\t%(message)s'
  14.     if debug: 
  15.         hd = logging.StreamHandler() 
  16.         logger.setLevel(logging.DEBUG) 
  17.         hd.setFormatter(formatter) 
  18.     else
  19.         hd = logging.FileHandler(f'{__name__}.log''a', encoding='utf-8'
  20.         logger.setLevel(logging.INFO) 
  21.         hd.setFormatter(formatter) 
  22.     logger.addHandler(hd) 
  23.  
  24. if __name__ == '__main__'
  25.    parser = create_args_parse() 
  26.    args = parser.parse_args() 
  27.    debug = args.debug 
  28.    set_logger(debug) 
  29.    ... 

代碼有點長,但不難懂。

  • create_args_parse 方法用于解析命令行參數(shù),其中定義了一個 debug 參數(shù),表示開啟調(diào)試模式
  • set_logger 方法接收一個是否為調(diào)試模式的參數(shù),根據(jù)是否為調(diào)試模式,設(shè)置不同的日志模式
  • main 中,首先調(diào)用 create_args_parse 獲得命令行參數(shù)對象,然后從中解析出參數(shù),提取 debug 模式,傳送給 set_logger 方法,設(shè)置日志模式
  • 這樣只需要在運行程序時,加上參數(shù) -d 就可以讓日志打印到終端上,不加,日志就會自動去 __main__.log 日志文件中去了。

總結(jié)

python 為我們提供了很多便利的功能,有些需要真的用到才能有所體會,所以在遇到問題時,需要多研究一下,找到其中的特點和內(nèi)在的原理或機制,這樣就能更好的應用了。

在我理解了 logging 的原理之后,已經(jīng)在我的很多項目中發(fā)揮了巨大作用,而且再也不必糾結(jié)于怎么用,如何更合理等這些問題了。

期望這篇文章也能對你有所幫助,比心。

參考資料

[1]pymysqlpool: https://pypi.org/project/pymysql-pool/

[2]pymysql: https://pypi.org/project/PyMySQL/

 

責任編輯:武曉燕 來源: Python技術(shù)
相關(guān)推薦

2014-04-17 16:42:03

DevOps

2022-07-26 00:00:22

HTAP系統(tǒng)數(shù)據(jù)庫

2021-01-15 07:44:21

SQL注入攻擊黑客

2020-02-27 10:49:26

HTTPS網(wǎng)絡協(xié)議TCP

2019-09-16 08:40:42

2014-11-28 10:31:07

Hybrid APP

2023-03-16 10:49:55

2012-05-31 09:56:54

云安全

2022-12-12 08:46:11

2022-03-14 07:53:27

ELTETL大數(shù)據(jù)

2023-10-24 08:53:24

FutureTas并發(fā)編程

2015-07-31 10:35:18

實時計算

2019-11-06 09:52:01

JavaScript單線程非阻塞

2017-10-18 22:01:12

2025-01-03 08:09:15

2024-02-02 08:50:20

Node.js元數(shù)據(jù)自動化

2023-11-01 13:48:00

反射java

2022-06-29 10:21:33

3d打印輔助工具

2021-11-26 08:07:16

MySQL SQL 語句數(shù)據(jù)庫

2016-11-02 12:06:27

分布式系統(tǒng)大數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號

少妇一级淫免费播放| 日本亚洲自拍| 日韩和一区二区| 蜜臀av免费一区二区三区 | 一区二区三区四区国产| 成 人片 黄 色 大 片| 99精品热视频只有精品10| 在线成人一区二区| 潘金莲一级淫片aaaaa| 超碰国产一区| 亚洲免费视频中文字幕| 精品国产免费久久久久久尖叫| 波多野结衣一本一道| 综合久久一区| 在线看日韩欧美| 国产a√精品区二区三区四区| 欧美美女日韩| 一区二区成人在线| 日韩在线导航| 天天色综合久久| 国产在线播放一区| 国产成人精品视频在线| 18精品爽视频在线观看| 日韩在线观看| 亚洲国产精品热久久| www.久久久久久久久久久| 日韩理论视频| 亚洲一区二区三区影院| 亚洲欧洲精品一区二区三区波多野1战4| 黄色片一区二区| 久久99精品久久久久| 日本精品va在线观看| 九热这里只有精品| 伊人久久大香线| 最新国产成人av网站网址麻豆| 真人bbbbbbbbb毛片| 欧美专区视频| 777xxx欧美| 国产高清视频网站| 99re66热这里只有精品4| 五月天亚洲婷婷| 伊人久久在线观看| 久久精品视频观看| 中文字幕电影一区| 奇米影视首页 狠狠色丁香婷婷久久综合| 午夜精品久久久久久久91蜜桃| 日本成人在线不卡视频| 日韩免费不卡av| 久久久免费高清视频| 亚洲久久一区二区| 亚州成人av在线| 日韩xxxxxxxxx| 亚洲高清毛片| 97激碰免费视频| 国产午夜精品无码一区二区| 欧美久久一级| 久久精品国产清自在天天线| 超碰人人人人人人人| 日韩一区二区中文| 菠萝蜜影院一区二区免费| 成人欧美一区二区三区黑人一| 成人精品亚洲| 中文字幕无线精品亚洲乱码一区| 国产精品av久久久久久无| 激情综合网站| 日韩在线中文字| 欧美色视频一区二区三区在线观看| 欧美日韩在线观看视频小说| 在线视频欧美日韩精品| www成人啪啪18软件| 久久精品国内一区二区三区水蜜桃| 久久精品99久久香蕉国产色戒| 少妇高潮一区二区三区喷水| 91精品天堂福利在线观看| 欧美成人三级视频网站| 国产在线观看99| 99精品欧美| 国产精品第8页| 在线播放精品视频| 国产精品亚洲а∨天堂免在线| 99re资源| 四虎精品成人影院观看地址| 国产无遮挡一区二区三区毛片日本| 亚洲成人第一| 丝袜在线观看| 欧美午夜女人视频在线| 性生交免费视频| 日韩精品久久久久久久软件91| 精品国产3级a| 日本一级免费视频| 亚洲综合色站| 欧洲中文字幕国产精品| 亚洲综合精品在线| 不卡在线视频中文字幕| 日本在线免费观看一区| 国产在线观看免费麻豆| 欧美日韩国产综合新一区| 午夜免费一区二区| 一区二区日韩| 在线精品播放av| 18精品爽视频在线观看| 日本视频免费一区| 国产乱码一区| 日本在线视频站| 精品日本高清在线播放| 亚洲精品www.| 亚欧日韩另类中文欧美| 久热99视频在线观看| 天天干天天干天天| 国产精品99久久不卡二区| 青娱乐国产91| 国产丝袜在线观看视频| 91搞黄在线观看| www.美色吧.com| 国产精品99一区二区三区| 91av视频在线| 成人高潮片免费视频| 中文字幕免费观看一区| 欧美黑人经典片免费观看| 小说区图片区亚洲| 国产午夜精品全部视频在线播放 | 午夜精品一区二区三区电影天堂| 欧美婷婷精品激情| 亚洲影院天堂中文av色| 久久久久免费视频| 国产精品老熟女视频一区二区| 久久青草国产手机看片福利盒子| 女人色极品影院| 豆花视频一区| 日韩最新免费不卡| jizz国产在线观看| 久久亚洲一区二区三区明星换脸| 欧美久久久久久久久久久久久久| 青娱乐极品盛宴一区二区| 亚洲天堂av在线播放| 性无码专区无码| 不卡高清视频专区| 欧美中日韩在线| 亚洲视频精选| 欧美成人激情视频| 国产欧美熟妇另类久久久 | 国产亚洲精品久久久久久777| 久久久久久久久99| 国产精品一区在线| 日韩video| 亚洲成人影音| 色综合久综合久久综合久鬼88 | 丁香婷婷久久| 中文字幕日韩精品有码视频| 黄色av网站免费| 久久久99精品免费观看不卡| 日韩精品视频久久| 影视先锋久久| 欧美最猛性xxxx| 久久久久久久久亚洲精品| 色综合久久88色综合天天| 少妇精品一区二区| 首页亚洲欧美制服丝腿| 日韩av影视| 国产精品xxx| 久久精品国产91精品亚洲| 一级全黄裸体免费视频| 亚洲欧美日韩久久精品| 在线观看你懂的视频| 亚洲国产一区二区三区高清 | 九一精品久久久| 中文精品电影| 国产精品一 二 三| 亚洲黄色免费看| 一区二区三区日韩在线| 91福利在线观看视频| 亚洲另类色综合网站| 国产一精品一aⅴ一免费| 99av国产精品欲麻豆| 欧美人与性禽动交精品| 国产精品99精品一区二区三区∴| 久久视频在线免费观看| 高h震动喷水双性1v1| 色综合一区二区三区| 懂色av蜜臀av粉嫩av永久| 国产成人亚洲综合a∨婷婷| 丁香色欲久久久久久综合网| 欧洲精品一区| 国产主播欧美精品| 激情网站在线| 亚洲性猛交xxxxwww| 99久久精品日本一区二区免费| 亚洲一区免费视频| 91成人破解版| 国产精品中文有码| 自慰无码一区二区三区| 9999国产精品| 精品国产一区二区三区免费| 久久精品嫩草影院| 久久久久久久国产精品| sese在线视频| 欧美精品一区二区蜜臀亚洲| 久久影视中文字幕| 一区二区三区小说| 亚洲人成人无码网www国产 | 50度灰在线| 亚洲欧美精品中文字幕在线| 国产精品自产拍| 色综合天天性综合| 青青草激情视频| 国产三级一区二区| 性欧美18—19sex性高清| 蜜芽一区二区三区| 俄罗斯av网站| 欧美在线1区| 午夜精品一区二区三区在线观看| 高清精品xnxxcom| 成人日韩在线电影| 毛片免费看不卡网站| 欧美激情按摩在线| 免费黄网在线观看| 亚洲欧美国产va在线影院| 亚洲国产剧情在线观看| 欧美日韩黄色一区二区| 国内自拍视频在线播放| 亚洲一区在线观看视频| 长河落日免费高清观看| 久久久综合精品| 久久精品aⅴ无码中文字字幕重口| 麻豆免费看一区二区三区| 国产极品粉嫩福利姬萌白酱| 好看不卡的中文字幕| 妞干网这里只有精品| 清纯唯美综合亚洲| 日韩久久不卡| 亚洲aaa级| 精品一区久久久久久| 超碰一区二区三区| 99se婷婷在线视频观看| 国产欧美日韩电影| 亚洲qvod图片区电影| 视频欧美精品| 国产精品黄视频| 在线国产成人影院| 国产不卡在线观看| 欧美色网在线| 国产成人精品亚洲精品| 日韩免费电影| 国产成人精品电影久久久| 成人免费网站视频| 欧美在线视频导航| 欧美动物xxx| 国产精品国产三级国产aⅴ9色 | 成人性生交大片免费看视频直播 | 日韩一区二区三区免费看 | 日本熟妇一区二区| 亚洲6080在线| 黄色片视频网站| 岛国av一区二区| 国产精品久久久久久久久久精爆| 欧美性猛交xxxx黑人猛交| 69视频免费在线观看| 欧美午夜激情视频| 无码人妻精品一区二区蜜桃色欲| 91精品福利在线| 丰满人妻一区二区三区四区| 欧美日韩一卡二卡| 国产精品无码一区二区桃花视频| 91麻豆精品久久久久蜜臀| 国产成人精品亚洲精品色欲| 欧美成人a在线| 内射无码专区久久亚洲| 日韩精品中文字幕久久臀| 色噜噜在线播放| 亚洲欧美国产视频| 天天在线视频色| 欧美激情一级欧美精品| 末成年女av片一区二区下载| 国产精品白丝jk喷水视频一区 | 欧美性受ⅹ╳╳╳黑人a性爽| 国内精品伊人久久| 日本精品不卡| 91精品国产综合久久香蕉最新版| 免费精品一区二区三区在线观看| 国产伦精品一区二区三区在线| 亚洲精品蜜桃乱晃| 一区二区日本| 亚洲激情精品| 久久婷婷综合色| 床上的激情91.| 国产一级久久久久毛片精品| 亚洲欧美视频在线观看视频| 日本一区二区免费在线观看| 色女孩综合影院| 精品久久在线观看| 亚洲欧美综合另类中字| av毛片在线播放| 欧美在线视频一区二区| 在线日韩三级| 快播亚洲色图| 女人天堂亚洲aⅴ在线观看| 亚洲中文字幕无码中文字| 国内精品伊人久久久久av影院| 日韩精品国产一区| 欧美国产日韩一二三区| 久久中文字幕无码| 欧美日韩黄色影视| 欧洲成人av| 欧美日韩国产成人在线观看| 中文字幕日本一区二区| 国产91精品入口17c| 日韩在线视屏| 久久无码高潮喷水| 国产精品12区| 国精产品久拍自产在线网站| 亚洲第一精品在线| 国产免费高清av| 中文国产成人精品| 在线免费三级电影网站| 操人视频欧美| 国产精品99一区二区三区| 国产性生交xxxxx免费| 成人黄色a**站在线观看| 人人澡人人澡人人看| 在线亚洲一区二区| 四虎精品成人影院观看地址| 欧美激情奇米色| 免费观看亚洲视频大全| 亚洲一区二区在线免费观看| 国产伦理一区| 国产精品入口麻豆| 一区二区成人在线| 精品区在线观看| 久久九九全国免费精品观看| 日韩高清不卡| 日本黄网免费一区二区精品| 99亚洲视频| 欧美无人区码suv| 午夜精品久久久久久久| 亚洲国产精品久久人人爱潘金莲| 久久视频在线直播| 国产精品日韩精品在线播放| 中文字幕一区二区三区有限公司| 美女一区二区三区| 久久婷婷五月综合| 欧美怡红院视频| eeuss影院在线播放| 国产精品久久久久久久9999| 精品亚洲成人| 亚洲一级免费观看| 国产精品久久久久国产精品日日 | 久88久久88久久久| 北条麻妃在线观看视频| 在线播放/欧美激情| 久久bbxx| 亚洲自拍小视频| 欧美女激情福利| 亚洲av无码一区东京热久久| 一区二区国产视频| 涩涩视频免费看| 国产91精品青草社区| 久久99青青| 青青青在线视频免费观看| 欧美国产日产图区| 国产精品欧美亚洲| 欧美日韩国产999| 欧美人与动xxxxz0oz| 精品一区二区中文字幕| 国产拍欧美日韩视频二区| 在线观看日批视频| 久久久国产91| 成人高潮a毛片免费观看网站| 加勒比成人在线| 久久久噜噜噜久久中文字幕色伊伊| 在线视频一区二区三区四区| 国产亚洲欧美日韩精品| 日本免费成人| 欧美国产视频一区| 91社区在线播放| 亚洲天堂自拍偷拍| 欧美激情a在线| 亚洲制服欧美另类| 日韩精品视频一二三| 一区二区免费视频| 三级在线视频| 成人免费福利视频| 亚洲第一精品影视| 免费看黄色三级| 日韩欧美中文一区二区| a一区二区三区| 小说区视频区图片区| 成年人国产精品| 一级特黄色大片| 午夜精品免费视频| 日本一区二区高清不卡| 极品白嫩的小少妇| 在线视频你懂得一区二区三区| 成年人黄视频在线观看| 久久免费视频1| 国产一区二区三区精品视频| 一级片中文字幕| 欧美日本中文字幕| 精品久久成人| 在线观看国产免费视频| 在线不卡欧美精品一区二区三区|