欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python logging日志模塊使用指南

 更新時間:2023年08月23日 10:04:33   作者:一瓶子不滿半瓶子晃蕩  
Python 的 logging 模塊提供了標(biāo)準(zhǔn)的日志接口,可以通過它存儲各種格式的日志,日志記錄提供了一組便利功能,用于簡單的日志記錄用法,本文就給大家簡單的介紹一下Python logging日志模塊使用方法,需要的朋友可以參考下

Python logging 模塊定義了為應(yīng)用程序和庫實現(xiàn)靈活的事件日志記錄的函數(shù)和類。

程序開發(fā)過程中,很多程序都有記錄日志的需求,并且日志包含的信息有正常的程序訪問日志還可能有錯誤、警告等信息輸出,Python 的 logging 模塊提供了標(biāo)準(zhǔn)的日志接口,可以通過它存儲各種格式的日志,日志記錄提供了一組便利功能,用于簡單的日志記錄用法。

  • 使用 Python Logging 模塊的主要好處是所有 Python 模塊都可以參與日志記錄
  • Logging 模塊提供了大量具有靈活性的功能

日志記錄函數(shù)以它們用來跟蹤的事件的級別或嚴(yán)重性命名。下面描述了標(biāo)準(zhǔn)級別及其適用性(從高到低的順序):

日志等級(level)描述
DEBUG最詳細(xì)的日志信息,典型應(yīng)用場景是 問題診斷
INFO信息詳細(xì)程度僅次于DEBUG,通常只記錄關(guān)鍵節(jié)點信息,用于確認(rèn)一切都是按照我們預(yù)期的那樣進行工作
WARNING當(dāng)某些不期望的事情發(fā)生時記錄的信息(如,磁盤可用空間較低),但是此時應(yīng)用程序還是正常運行的
ERROR由于一個更嚴(yán)重的問題導(dǎo)致某些功能不能正常運行時記錄的信息
CRITICAL當(dāng)發(fā)生嚴(yán)重錯誤,導(dǎo)致應(yīng)用程序不能繼續(xù)運行時記錄的信息

日志級別等級排序:critical > error > warning > info > debug

級別越高打印的日志越少,反之亦然,即

  • debug : 打印全部的日志( notset 等同于 debug )
  • info : 打印 info, warning, error, critical 級別的日志
  • warning : 打印 warning, error, critical 級別的日志
  • error : 打印 error, critical 級別的日志
  • critical : 打印 critical 級別

一、 Logging 模塊日志記錄方式

Logging 模塊提供了兩種日志記錄方式:

  • 一種方式是使用 Logging 提供的模塊級別的函數(shù)
  • 另一種方式是使用 Logging 日志系統(tǒng)的四大組件記錄

1、Logging 定義的模塊級別函數(shù)

函數(shù)說明
logging.debug(msg, *args, **kwargs)創(chuàng)建一條嚴(yán)重級別為DEBUG的日志記錄
logging.info(msg, *args, **kwargs)創(chuàng)建一條嚴(yán)重級別為INFO的日志記錄
logging.warning(msg, *args, **kwargs)創(chuàng)建一條嚴(yán)重級別為WARNING的日志記錄
logging.error(msg, *args, **kwargs)創(chuàng)建一條嚴(yán)重級別為ERROR的日志記錄
logging.critical(msg, *args, **kwargs)創(chuàng)建一條嚴(yán)重級別為CRITICAL的日志記錄
logging.log(level, *args, **kwargs)創(chuàng)建一條嚴(yán)重級別為level的日志記錄
logging.basicConfig(**kwargs)對root logger進行一次性配置

簡單打印日志:

import logging
# 打印日志級別
def test_logging():
    logging.debug('Python debug')
    logging.info('Python info')
    logging.warning('Python warning')
    logging.error('Python Error')
    logging.critical('Python critical')
test_logging()

輸出結(jié)果:

WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical

當(dāng)指定一個日志級別之后,會記錄大于或等于這個日志級別的日志信息,小于的將會被丟棄, ==默認(rèn)情況下日志打印只顯示大于等于 WARNING 級別的日志。==

1.1 設(shè)置日志顯示級別

通過 logging.basicConfig() 可以設(shè)置 root 的日志級別,和日志輸出格式。

logging.basicConfig() 關(guān)鍵字參數(shù)

關(guān)鍵字描述
filename創(chuàng)建一個 FileHandler,使用指定的文件名,而不是使用 StreamHandler。
filemode如果指明了文件名,指明打開文件的模式(如果沒有指明 filemode,默認(rèn)為 ‘a’)。
formathandler 使用指明的格式化字符串。
datefmthandler 使用指明的格式化字符串。
level指明根 logger 的級別。
stream使用指明的流來初始化 StreamHandler。該參數(shù)與 ‘filename’ 不兼容,如果兩個都有,’stream’ 被忽略。

format 格式

格式描述
%(levelno)s打印日志級別的數(shù)值
%(levelname)s打印日志級別名稱
%(pathname)s打印當(dāng)前執(zhí)行程序的路徑
%(filename)s打印當(dāng)前執(zhí)行程序名稱
%(funcName)s打印日志的當(dāng)前函數(shù)
%(lineno)d打印日志的當(dāng)前行號
%(asctime)s打印日志的時間
%(thread)d打印線程 ID
%(threadName)s打印線程名稱
%(process)d打印進程 ID
%(message)s打印日志信息

注意:Logging.basicConfig() 需要在開頭就設(shè)置,在中間設(shè)置并無作用

實例

import logging
# 打印日志級別
def test():
    logging.basicConfig(level=logging.DEBUG)
    logging.debug('Python debug')
    logging.info('Python info')
    logging.warning('Python warning')
    logging.error('Python Error')
    logging.critical('Python critical')
    logging.log(2,'test')
test()

輸出:

DEBUG:root:Python debug
INFO:root:Python info
WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical

1.2 將日志信息記錄到文件

# 日志信息記錄到文件
logging.basicConfig(filename='F:/example.log', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')

在相應(yīng)的路徑下會有 example.log 日志文件,內(nèi)容如下:

DEBUG:root:This message should go to the log file
INFO:root:So should this
WARNING:root:And this, too

1.3 多個模塊記錄日志信息

如果程序包含多個模塊,則用以下實例來顯示日志信息: 實例中有兩個模塊,一個模塊通過導(dǎo)入另一個模塊的方式用日志顯示另一個模塊的信息:

myapp.py 模塊

import logging
import mylib
def main():
    logging.basicConfig(filename='myapp.log',level=logging.DEBUG)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')
if __name__ == '__main__':
    main()

mylib.py 模塊

import logging
def do_something():
    logging.info('Doing something')

執(zhí)行 myapp.py 模塊會打印相應(yīng)日志,在文件 myapp.log 中顯示信息如下:

INFO:root:Started
INFO:root:Doing something
INFO:root:Finishe

1.4 顯示信息的日期及更改顯示消息格式

顯示消息日期

import logging
# 顯示消息時間
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

結(jié)果:

2019-10-16 18:57:45,988 is when this event was logged.
2019-10-16 18:57:45,988 is when this event was logged.

更改顯示消息格式

import logging
# 更改顯示消息的格式
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
logging.debug('Python message format Debug')
logging.info('Python message format Info')
logging.warning('Python message format Warning')

結(jié)果:

DEBUG:Python message format Debug
INFO:Python message format Info
WARNING:Python message format Warning

==注意==:顯示結(jié)果只顯示級別和具體信息,之前顯示的 “根” 已經(jīng)消失,重新定義的格式修改了默認(rèn)輸出方式。

2、logging 模塊四大組件

組件名稱對應(yīng)類名功能描述
日志器Logger暴露函數(shù)給應(yīng)用程序,基于日志記錄器和過濾器級別決定哪些日志有效
處理器Handler將 logger 創(chuàng)建的日志記錄發(fā)送到合適的目的輸出
過濾器Filter提供了更細(xì)粒度的控制工具來決定輸出哪條日志記錄,丟棄哪條日志記錄
格式器Formatter決定日志記錄的最終輸出格式

2.1 日志器- Logger

Logger 持有日志記錄器的方法,日志記錄器不直接實例化,而是通過模塊級函數(shù) logger.getlogger (name) 來實例化,使用相同的名稱多次調(diào)用 getLogger() 總是會返回對相同 Logger 對象的引用。

  • 應(yīng)用程序代碼能直接調(diào)用日志接口。
  • Logger最常用的操作有兩類:配置和發(fā)送日志消息。
  • 初始化 logger = logging.getLogger(“endlesscode”),獲取 logger 對象,getLogger() 方法后面最好加上所要日志記錄的模塊名字,配置文件和打印日志格式中的 %(name)s 對應(yīng)的是這里的模塊名字,如果不指定name則返回root對象。
  • logger.setLevel(logging.DEBUG),Logging 中有 NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL這幾種級別,日志會記錄設(shè)置級別以上的日志
  • 多次使用相同的name調(diào)用 getLogger 方法返回同一個 looger 對象;

Logger是一個樹形層級結(jié)構(gòu),在使用接口 debug,info,warn,error,critical 之前必須創(chuàng)建 Logger 實例:

創(chuàng)建方法: logger = logging.getLogger(logger_name)?

創(chuàng)建Logger實例后,可以使用以下方法進行日志級別設(shè)置,增加處理器 Handler:

  • logger.setLevel(logging.ERROR) # 設(shè)置日志級別為 ERROR,即只有日志級別大于等于 ERROR 的日志才會輸出
  • logger.addHandler(handler_name) # 為 Logger 實例增加一個處理器
  • logger.removeHandler(handler_name) # 為 Logger 實例刪除一個處理器

2.2 處理器- Handler

Handler 處理器類型有很多種,比較常用的有三個,StreamHandler,F(xiàn)ileHandler,NullHandler

StreamHandler

創(chuàng)建方法:sh = logging.StreamHandler(stream=None)?

創(chuàng)建 StreamHandler 之后,可以通過使用以下方法設(shè)置日志級別,設(shè)置格式化器 Formatter,增加或刪除過濾器 Filter:

ch.setLevel(logging.WARN) # 指定日志級別,低于WARN級別的日志將被忽略
ch.setFormatter(formatter_name) # 設(shè)置一個格式化器formatter
ch.addFilter(filter_name) # 增加一個過濾器,可以增加多個
ch.removeFilter(filter_name) # 刪除一個過濾器

2.3 過濾器- Filter

Handlers 和 Loggers 可以使用 Filters 來完成比級別更復(fù)雜的過濾。 Filter 基類只允許特定 Logger 層次以下的事件。 例如用 ‘A.B’ 初始化的 Filter 允許Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ 等記錄的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。 如果用空字符串來初始化,所有的事件都接受。

創(chuàng)建方法: filter = logging.Filter(name='') 

2.4 格式器- Formatter

使用Formatter對象設(shè)置日志信息最后的規(guī)則、結(jié)構(gòu)和內(nèi)容,默認(rèn)的時間格式為%Y-%m-%d %H:%M:%S。

創(chuàng)建方法: formatter = logging.Formatter(fmt=None, datefmt=None)

其中,fmt 是消息的格式化字符串,datefmt 是日期字符串。如果不指明 fmt,將使用 ‘%(message)s’ 。如果不指明 datefmt,將使用 ISO8601 日期格式。

2.5 組件之間的關(guān)聯(lián)關(guān)系

  • 日志器(logger)需要通過處理器(handler)將日志信息輸出到目標(biāo)位置,不同的處理器(handler)可以將日志輸出到不同的位置;
  • 日志器(logger)可以設(shè)置多個處理器(handler)將同一條日志記錄輸出到不同的位置;
  • 每個處理器(handler)都可以設(shè)置自己的過濾器(filter)實現(xiàn)日志過濾,從而只保留感興趣的日志;
  • 每個處理器(handler)都可以設(shè)置自己的格式器(formatter)實現(xiàn)同一條日志以不同的格式輸出到不同的地方。

簡明了說就是:日志器(logger)是入口,真正干活兒的是處理器(handler),處理器(handler)還可以通過過濾器(filter)和格式器(formatter)對要輸出的日志內(nèi)容做過濾和格式化等處理操作。

  • Logger 可以包含一個或多個 Handler 和 Filter
  • Logger 與 Handler 或 Fitler 是一對多的關(guān)系
  • 一個 Logger 實例可以新增多 個 Handler,一個 Handler 可以新增多個格式化器或多個過濾器,而且日志級別將會繼承。

二、Logging 日志工作流程

1、Logging 模塊使用過程

1)第一次導(dǎo)入 logging 模塊或使用 reload 函數(shù)重新導(dǎo)入 logging 模塊,logging 模塊中的代碼將被執(zhí)行,這個過程中將產(chǎn)生 logging 日志系統(tǒng)的默認(rèn)配置。

2)自定義配置(可選),logging標(biāo)準(zhǔn)模塊支持三種配置方式: dictConfig,fileConfig,listen。其中,dictConfig 是通過一個字典進行配置 Logger,Handler,F(xiàn)ilter,F(xiàn)ormatter;fileConfig 則是通過一個文件進行配置;而 listen 則監(jiān)聽一個網(wǎng)絡(luò)端口,通過接收網(wǎng)絡(luò)數(shù)據(jù)來進行配置。當(dāng)然,除了以上集體化配置外,也可以直接調(diào)用 Logger,Handler 等對象中的方法在代碼中來顯式配置。
   
3)使用 logging 模塊的全局作用域中的 getLogger 函數(shù)來得到一個 Logger 對象實例(其參數(shù)即是一個字符串,表示 Logger 對象實例的名字,即通過該名字來得到相應(yīng)的 Logger 對象實例)。

4)使用 Logger 對象中的 debug,info,error,warn,critical 等方法記錄日志信息。

2、Logging 模塊處理流程

logging 處理流程

流程描述:

  1. 判斷日志的等級是否大于 Logger 對象的等級,如果大于,則往下執(zhí)行,否則,流程結(jié)束。
  2. 產(chǎn)生日志:第一步,判斷是否有異常,如果有,則添加異常信息。 第二步,處理日志記錄方法(如 debug,info 等)中的占位符,即一般的字符串格式化處理。
  3. 使用注冊到 Logger 對象中的 Filters 進行過濾。如果有多個過濾器,則依次過濾;只要有一個過濾器返回假,則過濾結(jié)束,且該日志信息將丟棄,不再處理,而處理流程也至此結(jié)束。否則,處理流程往下執(zhí)行。
  4. 在當(dāng)前 Logger 對象中查找 Handlers,如果找不到任何 Handler,則往上到該 Logger 對象的父 Logger 中查找;如果找到一個或多個 Handler,則依次用 Handler 來處理日志信息。但在每個 Handler 處理日志信息過程中,會首先判斷日志信息的等級是否大于該 Handler 的等級,如果大于,則往下執(zhí)行(由 Logger 對象進入 Handler 對象中),否則,處理流程結(jié)束。
  5. 執(zhí)行 Handler 對象中的 filter 方法,該方法會依次執(zhí)行注冊到該 Handler 對象中的 Filter。如果有一個 Filter 判斷該日志信息為假,則此后的所有 Filter 都不再執(zhí)行,而直接將該日志信息丟棄,處理流程結(jié)束。
  6. 使用 Formatter 類格式化最終的輸出結(jié)果。 注:Formatter 同上述第 2 步的字符串格式化不同,它會添加額外的信息,比如日志產(chǎn)生的時間,產(chǎn)生日志的源代碼所在的源文件的路徑等等。
  7. 真正地輸出日志信息(到網(wǎng)絡(luò),文件,終端,郵件等)。至于輸出到哪個目的地,由 Handler 的種類來決定。

三、配置日志

程序員可以通過三種方式配置日志記錄:

1、使用配置方法的 Python 代碼顯式創(chuàng)建記錄器,處理程序和格式化程序。

2、創(chuàng)建日志記錄配置文件并使用該 fileConfig() 功能讀取它。

3、創(chuàng)建配置信息字典并將其傳遞給 dictConfig()函數(shù)。

下面使用 Python 代碼配置一個非常簡單的記錄器,一個控制臺處理程序和一個簡單的格式化程序:

logging.conf 配置文件

[loggers]
keys=root,simpleExample
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

config_logging.py 配置器

import logging
# create logger
logger = logging.getLogger('simple_example')
logger.setLevel(logging.DEBUG)
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# create formatter
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch
ch.setFormatter(formatter)
# add ch to logger
logger.addHandler(ch)
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

recorder 記錄器

import logging
import logging.config
logging.config.fileConfig('logging.conf')
# create logger
logger = logging.getLogger('simpleExample')
# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

運行結(jié)果:

2019-10-16 19:45:34,440 - simple_example - DEBUG - debug message
2019-10-16 19:45:34,440 - simple_example - INFO - info message
2019-10-16 19:45:34,440 - simple_example - WARNING - warn message
2019-10-16 19:45:34,440 - simple_example - ERROR - error message
2019-10-16 19:45:34,441 - simple_example - CRITICAL - critical message

總結(jié)

本章節(jié)給大家介紹了 Python 標(biāo)準(zhǔn)庫中 Logging 模塊的詳細(xì)介紹與使用,對 Python 工程師使用該模塊提供更好的支撐

以上就是Python logging日志模塊使用指南的詳細(xì)內(nèi)容,更多關(guān)于Python logging模塊的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pytorch中的自動求梯度機制和Variable類實例

    Pytorch中的自動求梯度機制和Variable類實例

    今天小編就為大家分享一篇Pytorch中的自動求梯度機制和Variable類實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • 思考分析Python運算中?a+=b?和?a=a+b是否相等

    思考分析Python運算中?a+=b?和?a=a+b是否相等

    這篇文章主要為大家介紹了Python運算中a+=b和a=a+b是否相等及原理思考分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Python+selenium實現(xiàn)截圖圖片并保存截取的圖片

    Python+selenium實現(xiàn)截圖圖片并保存截取的圖片

    這篇文章介紹如何利用Selenium的方法進行截圖并保存截取的圖片,需要的朋友參考下本文
    2018-01-01
  • 利用Python實時獲取steam特惠游戲數(shù)據(jù)

    利用Python實時獲取steam特惠游戲數(shù)據(jù)

    Steam是由美國電子游戲商Valve于2003年9月12日推出的數(shù)字發(fā)行平臺,被認(rèn)為是計算機游戲界最大的數(shù)碼發(fā)行平臺之一。本文將利用Python實時獲取steam特惠游戲數(shù)據(jù),感興趣的可以嘗試一下
    2022-06-06
  • 基于Python pip用國內(nèi)鏡像下載的方法

    基于Python pip用國內(nèi)鏡像下載的方法

    今天小編就為大家分享一篇基于Python pip用國內(nèi)鏡像下載的方法。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python實現(xiàn)百度文庫自動化爬取

    python實現(xiàn)百度文庫自動化爬取

    項目是合法項目,只是進行數(shù)據(jù)解析而已,不能下載看不到的內(nèi)容.部分文檔在電腦端不能預(yù)覽,但是在手機端可以預(yù)覽,所有本項目把瀏覽器瀏覽格式改成手機端,支持Windows和Ubuntu. 本項目使用的是chromedriver來控制chrome來模擬人來操作來進行文檔爬取
    2021-04-04
  • python末尾逗號導(dǎo)致返回結(jié)果是一個元組的問題

    python末尾逗號導(dǎo)致返回結(jié)果是一個元組的問題

    在Python中,除非特別需要返回或傳參元組,一般不推薦在語句末尾添加逗號,應(yīng)該注意檢查是否存在末尾逗號導(dǎo)致的這些副作用,這篇文章主要介紹了python末尾逗號導(dǎo)致返回結(jié)果是一個元組,需要的朋友可以參考下
    2023-09-09
  • 如何使用Python代碼創(chuàng)建表格

    如何使用Python代碼創(chuàng)建表格

    如果能夠?qū)⑽覀兊臒o序數(shù)據(jù)快速組織成更易讀的格式,對于數(shù)據(jù)分析非常有幫助,下面這篇文章主要介紹了關(guān)于如何使用Python代碼創(chuàng)建表格的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Python reversed反轉(zhuǎn)序列并生成可迭代對象

    Python reversed反轉(zhuǎn)序列并生成可迭代對象

    這篇文章主要介紹了Python reversed反轉(zhuǎn)序列并生成可迭代對象,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • python先序遍歷二叉樹問題

    python先序遍歷二叉樹問題

    這篇文章主要介紹了python先序遍歷二叉樹問題,簡單分析了問題,然后向大家分享了代碼示例,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論