亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python日志logging模塊使用方法分析

系統(tǒng) 1750 0

本文實(shí)例講述了python日志logging模塊使用方法。分享給大家供大家參考,具體如下:

一、從一個使用場景開始

開發(fā)一個日志系統(tǒng), 既要把日志輸出到控制臺, 還要寫入日志文件

            
import logging
# 創(chuàng)建一個logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 創(chuàng)建一個handler,用于寫入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再創(chuàng)建一個handler,用于輸出到控制臺
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定義handler的輸出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 給logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 記錄一條日志
logger.info('foorbar')


          

運(yùn)行后, 在控制臺和日志文件都有一條日志:

2011-08-31 19:18:29,816 - mylogger - INFO - foorbar

二、logging模塊的API

結(jié)合上面的例子,我們說下幾個最常使用的API

logging.getLogger([name])返回一個logger實(shí)例,如果沒有指定name,返回root logger。只要name相同,返回的logger實(shí)例都是同一個而且只有一個,即name和logger實(shí)例是一一對應(yīng)的。這意味著,無需把logger實(shí)例在各個模塊中傳遞。只要知道name,就能得到同一個logger實(shí)例

Logger.setLevel(lvl)設(shè)置logger的level, level有以下幾個級別:

python日志logging模塊使用方法分析_第1張圖片

NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

如果把looger的級別設(shè)置為INFO, 那么小于INFO級別的日志都不輸出, 大于等于INFO級別的日志都輸出

            
logger.debug("foobar")  # 不輸出
logger.info("foobar")    # 輸出
logger.warning("foobar") # 輸出
logger.error("foobar")   # 輸出
logger.critical("foobar")  # 輸出


          

Logger.addHandler(hdlr)logger可以雇傭handler來幫它處理日志, handler主要有以下幾種:StreamHandler : 輸出到控制臺FileHandler :?? 輸出到文件handler還可以設(shè)置自己的level以及輸出格式。

            
logging.basicConfig([**kwargs])


          

這個函數(shù)用來配置root logger, 可以看它的源碼,還是挺簡單的。它首先檢查root是否有handler,如果沒有,那這個函數(shù)會創(chuàng)建一個StreamHandler,并設(shè)置默認(rèn)的formatter。

然后將該handler添加到root。如果調(diào)用 logging.basicConfig([**kwargs]) 的時候發(fā)現(xiàn)root logger已經(jīng)有了handler,那該函數(shù)沒有任何操作。

三、關(guān)于root logger以及l(fā)ogger的父子關(guān)系

前面多次提到root logger, 實(shí)際上logger實(shí)例之間還有父子關(guān)系, root logger就是處于最頂層的logger, 它是所有l(wèi)ogger的祖先。如下圖:

python日志logging模塊使用方法分析_第2張圖片

root logger是默認(rèn)的logger ,如果不創(chuàng)建logger實(shí)例, 直接調(diào)用logging.debug()、logging.info()logging.warning()、logging.error()、logging.critical()這些函數(shù),那么使用的logger就是 root logger, 它可以自動創(chuàng)建,也是單實(shí)例的。

如何得到root logger 通過logging.getLogger()或者logging.getLogger("")得到root logger實(shí)例。

默認(rèn)的level :root logger默認(rèn)的level是logging.WARNING

如何表示父子關(guān)系 logger的name的命名方式可以表示logger之間的父子關(guān)系. 比如:parent_logger = logging.getLogger('foo')child_logger = logging.getLogger('foo.bar')

什么是effective level logger有一個概念,叫effective level。 如果一個logger沒有顯示地設(shè)置level,那么它就用父親的level。如果父親也沒有顯示地設(shè)置level, 就用父親的父親的level,以此推....最后到達(dá)root logger,一定設(shè)置過level。默認(rèn)為logging.WARNINGchild loggers得到消息后,既把消息分發(fā)給它的handler處理,也會傳遞給所有祖先logger處理,

來看一個例子

            
import logging
# 設(shè)置root logger
r = logging.getLogger()
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
r.addHandler(ch)
# 創(chuàng)建一個logger作為父親
p = logging.getLogger('foo')
p.setLevel(logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(message)s')
ch.setFormatter(formatter)
p.addHandler(ch)
# 創(chuàng)建一個孩子logger
c = logging.getLogger('foo.bar')
c.debug('foo')


          

輸出如下:

2011-08-31 21:04:29,893 - foo
2011-08-31 21:04:29,893 - DEBUG - foo

可見, 孩子logger沒有任何handler,所以對消息不做處理。但是它把消息轉(zhuǎn)發(fā)給了它的父親以及root logger。最后輸出兩條日志。

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python日志操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》

希望本文所述對大家Python程序設(shè)計有所幫助。


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 青草视频网站 | 岛国大片免费在线观看 | 看一级毛片一区二区三区免费 | 久久久久国产精品美女毛片 | 日韩欧美一卡二区 | 奇米影视777欧美在线观看 | 国产视频一区二区三区四区 | 日韩欧美毛片免费看播放 | 在线视频日韩 | 91视频观看免费 | 欧美中文字幕视频 | 免费一级毛片清高播放 | 欧美精品久久久亚洲 | 九天玄帝诀高清300集免费观看 | 久久riav| 天天艹| 成人在线观看网站 | 久久综合中文字幕一区二区三区 | 松永纱奈在线观看 | 久草青草 | 日本道在线视频 | 国产1区2区三区不卡 | 美欧毛片 | 天天操夜夜摸 | 蜜桃综合 | 91九色在线视频 | 伊人精品 | 毛片69| 亚洲黄色免费在线观看 | 国产日韩精品一区在线观看播放 | 91精品久久一区二区三区 | 国产精品天天影视久久综合网 | 在线亚洲国产精品区 | 成人午夜性a一级毛片美女 成人午夜性视频欧美成人 成人午夜亚洲影视在线观看 | 久草手机视频 | 最近中文字幕在线视频1 | 九九九影院 | 日本高清一级做a爱过程免费视频 | 奇米在线视频 | 国产一级毛片国语版 | 操操操干干 |