91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-08-31 15:35:21 來源:腳本之家 閱讀:146 作者:平和的心 欄目:開發技術

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

一、從一個使用場景開始

開發一個日志系統, 既要把日志輸出到控制臺, 還要寫入日志文件

import logging
# 創建一個logger
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
# 創建一個handler,用于寫入日志文件
fh = logging.FileHandler('test.log')
fh.setLevel(logging.DEBUG)
# 再創建一個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')

運行后, 在控制臺和日志文件都有一條日志:

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

二、logging模塊的API

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

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

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

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

NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL

如果把looger的級別設置為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還可以設置自己的level以及輸出格式。

logging.basicConfig([**kwargs])

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

然后將該handler添加到root。如果調用logging.basicConfig([**kwargs])的時候發現root logger已經有了handler,那該函數沒有任何操作。

三、關于root logger以及logger的父子關系

前面多次提到root logger, 實際上logger實例之間還有父子關系, root logger就是處于最頂層的logger, 它是所有logger的祖先。如下圖:

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

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

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

默認的level:root logger默認的level是logging.WARNING

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

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

來看一個例子

import logging
# 設置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)
# 創建一個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)
# 創建一個孩子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,所以對消息不做處理。但是它把消息轉發給了它的父親以及root logger。最后輸出兩條日志。

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python日志操作技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總》

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

通河县| 万山特区| 乌鲁木齐市| 五大连池市| 镇宁| 博野县| 乌兰察布市| 当阳市| 阿拉善盟| 卢湾区| 体育| 瑞安市| 玉屏| 凭祥市| 涿鹿县| 东源县| 集安市| 桂阳县| 沿河| 斗六市| 湖北省| 黄陵县| 嘉荫县| 钟祥市| 米易县| 禹城市| 大田县| 东宁县| 铁岭市| 广平县| 布尔津县| 苏州市| 宁夏| 蕉岭县| 江山市| 寿阳县| 类乌齐县| 衡阳县| 枣强县| 宾阳县| 凤城市|