Python 日誌模塊logging分析及使用-1

內容目錄

1、日誌級別2、logging流程3、幾個重要的類3.1 Logger類3.1.1 最經常使用的配置方法3.1.2 建立Logger對象logging.getLogger([name])3.2 Handler類3.3 Filter類3.4 Formatter類4、使用示例4.1 直接調用logging接口4.2 使用basicConfig()函數4.3 一步步配置Logger4.4 經過dictConfig配置4.4.1 dictConfig()4.4.2 配置規則4.4.3 配置示例html

開發部署項目時,不可能將全部的信息都輸出到控制檯中,所以咱們將這些信息記錄到日誌文件中,不只方便查看程序運行的狀況,也能夠在項目出現故障時根據該運行時產生的日誌快速定位問題。python

Python中提供了日誌模塊logging,能夠方便的記錄日誌信息。web

本文主要分析了logging模塊的相關知識及具體使用。
當前介紹該日誌模塊的文章有不少,之因此還要進行記錄,一方面是由於沒有看到系統的介紹,二是經過梳理此部份內容,作到不止會用,還明白內部函數調用。服務器

1、日誌級別

Python標準庫logging用作記錄日誌,默認分爲五種日誌級別:網絡

  • DEBUG(10):詳細信息,調試問題時所需
  • INFO(20):證實事情可按預期工做
  • WARNING(30):有意外,未來可能發生問題,但依然可用
  • ERROR(40):嚴重問題,程序不能執行一些功能
  • CRITICAL(50):嚴重錯誤

咱們自定義日誌級別時注意不要和默認的日誌級別數值型相同(這是什麼意思呢?),logging執行時輸出大於等於設置的值日級別的日誌信息,如設置級別爲INFO,則INFO, WARNING, ERROR, CRITICAL級別的日誌都會輸出。
5種等級分別對應5種日誌打印方法:debug, info, warning, error, critical
默認的是WARNING,即當等級大於等於WARNING才被跟蹤。app

2、logging流程

官方的logging模塊工做流程圖以下:
函數

logging流程圖
logging流程圖
logging流程圖

從上圖中能夠看到這幾種python類型,Logger, LogRecord, Filter, Handler, Formatter
類型說明佈局

  • Logger日誌,暴露函數給應用程序,基於日誌記錄器和過濾器級別決定哪些日誌有效。
  • LogRecord日誌記錄器,將日誌傳到相應的處理器處理。
  • Handler處理器,將(日誌記錄器產生的)日誌記錄發送至合適的目的地。
  • Filter過濾器,提供了更好的粒度控制,它能夠決定輸出哪些日誌記錄。
  • Formatter格式化器,指明瞭最終輸出中日誌記錄的佈局。

基本流程:學習

  • 判斷Logger對象對於設置的級別是否可用,若是可用,則往下執行,不然,流程結束。
  • 建立LogRecord對象,若是註冊到Logger對象中的Filter對象過濾後返回False, 則不記錄日誌,流程結束,不然,向下執行。
  • LogRecord對象將Handler對象傳入當前的Logger對象,(圖中子流程)若是Handler對象的日誌級別大於設置的日記級別,再判斷註冊到Handler對象中的Filter對象過濾後是否返回True而放行輸出日誌信息,不然不放行,流程結束。
  • 若是傳入的Handler大於Logger中設置的級別,也即Handler有效,則往下執行,不然,流程結束。
  • 判斷這個Logger對象是否還有父Logger對象,若是沒有(表明當前Logger對象是最頂層的Logger對象root Logger),流程結束。不然將Logger對象設置爲它的父Logger對象,重複上面3,4兩步,輸出父類Logger對象中的日誌輸出,直到是root Logger對象。

3、幾個重要的類

前面講logging流程的時候,提到幾個概念:LoggerHandlerFilterFormatterui

3.1 Logger類

Logger對象有3個任務要作:

  • 嚮應用程序代碼暴露info, debug等方法,使應用程序能夠在運行時記錄日誌消息
  • 基於日誌級別(默認的過濾設施)或Filter對象來決定要對哪些日誌進行後續處理
  • 將日誌消息傳送給全部感興趣的日誌handlers

一個系統只有一個根Logger對象,而且該對象不能被直接實例化

經過調用logging.getLogger(name)函數建立Logger類對象。

Logger對象最經常使用的方法有兩類:(1)配置方法,(2)消息發送方法

Logger對象能夠設置多個Handler對象和Filter對象,Handler對象能夠設置Formatter對象。
Formatter對象用來設置消息的具體輸出格式。

3.1.1 最經常使用的配置方法

方法 描述
Logger.setLevel 設置日誌器將會處理的日誌消息的最低嚴重級別
Logger.addHandler() 爲該Logger對象添加一個handler對象
Logger.removeHandler 爲該Logger對象移除一個handler對象
Logger.addFilter()和Logger.removeFilter() 爲該Logger對象添加 和 移除一個filter對象

logger對象配置完成後,可以使用下面的方法來建立日誌記錄:

  • Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), Logger.critical():建立一個與他們的方法名對應等級的日誌記錄
  • Logger.exception():建立一個相似於Logger.error()的日誌消息
  • Logger.log():須要獲取一個明確的日誌level參數來建立一個日誌記錄

1. 獲取Logger對象
一般是經過--logging.getLogger()的方法。該方法有一個可選參數name,該參數表示將要返回的日誌器的名稱標識,若是不提供該參數,則其值爲root
若以相同的name參數值屢次調用getLogger()方法,將會返回指向同一個Logger對象的引用。

2. logger的層級結構與有效等級

  • logger的名稱是一個以 '.' 分割的層級結構,每一個'.'後面的logger都是'.'前面的loggerchildren,例如,有一個名稱爲 foologger,其它名稱分別爲foo.bar, foo.bar.bazfoo.bam都是 foo 的後代。

  • logger有一個"有效等級(effective level"的概念。若是一個logger上沒有被明確設置一個level,那麼該logger就是使用它parent的level;若是它的parent也沒有明確設置level則繼續向上查找parentparent的有效level,依次類推,直到找到個一個明確設置了level的祖先爲止。須要說明的是,root logger老是會有一個明確的level設置(默認爲 WARNING。當決定是否去處理一個已發生的事件時,logger的有效等級將會被用來決定是否將該事件傳遞給該loggerhandlers進行處理。

  • child loggers在完成對日誌消息的處理後,默認會將日誌消息傳遞給與它們的祖先loggers相關的handlers。所以,咱們沒必要爲一個應用程序中所使用的全部loggers定義和配置handlers,只須要爲一個頂層的`logger`配置`handlers`,而後按照須要建立child loggers就可足夠了。咱們也能夠經過將一個logger的propagate屬性設置爲False來關閉這種傳遞機制。

3.1.2 建立Logger對象logging.getLogger([name])

日誌記錄的工做主要由Logger對象來完成。前面講到一個系統只有一個根Logger對象,而且該對象不能被直接實例化

須要經過logging.getLogger([name])來獲取Logger對象。
在調用getLogger時要提供Logger的名稱(屢次使用相同名稱來調用getLogger,返回的是同一個對象的引用。),Logger實例之間有層次關係,這些關係經過Logger名稱來體現。

1p = logging.getLogger(「root」)
2c1 = logging.getLogger(「root.c1」)
3c2 = logging.getLogger(「root.c2」)
複製代碼

例子中,p父logger, c1,c2分別是p的子loggerc1, c2將繼承p的設置。若是省略了name參數, getLogger將返回日誌對象層次關係中的根Logger

每一個Logger對象均可以設置一個名字,若是設置logger = logging.getLogger(__name__)__name__Python中的一個特殊內置變量,他表明當前模塊的名稱(默認爲__main__)。

該函數內部根據是否指定名稱返回對應的Logger對象

 1root = RootLogger(WARNING)
2Logger.root = root
3Logger.manager = Manager(Logger.root)
4
5def getLogger(name=None):
6    """
7    Return a logger with the specified name, creating it if necessary.
8    If no name is specified, return the root logger.
9    """

10    if name:
11        return Logger.manager.getLogger(name)
12    else:
13        return root
複製代碼

示例:

1import logging
2logger = logging.getLogger('test')
3logger.warning('this is a warning info')
4# 輸出
5WARNING:test:this is a warning info
複製代碼

3.2 Handler類

Handler對象的做用是(基於日誌消息的等級)將消息分發到handler指定的位置(文件、網絡、郵件等)。Logger對象能夠經過addHandler()方法爲本身添加handler對象。

應用程序代碼不該該直接實例化和使用Handler實例。由於Handler是一個基類,只定義了全部handlers都應該有的接口,同時提供了一些子類能夠直接使用或覆蓋的默認行爲。

經常使用接口有:

  • setLevel()
  • setFormatter()
  • set_name()

經常使用的Handler

Handler 描述
logging.StreamHandler 將日誌消息發送到輸出到Stream,如std.out, std.err或任何file-like對象。
logging.FileHandler 將日誌消息發送到磁盤文件,默認狀況下文件大小會無限增加
logging.handlers.RotatingFileHandler 將日誌消息發送到磁盤文件,並支持日誌文件按大小切割
logging.hanlders.TimedRotatingFileHandler 將日誌消息發送到磁盤文件,並支持日誌文件按時間切割
logging.handlers.HTTPHandler 將日誌消息以GETPOST的方式發送給一個HTTP服務器
logging.handlers.SMTPHandler 將日誌消息發送給一個指定的email地址
logging.NullHandler Handler實例會忽略error messages,一般被想使用logginglibrary開發者使用來避免'No handlers could be found for logger XXX'信息的出現。

類之間的繼承關係以下:

在這裏插入圖片描述
在這裏插入圖片描述

示例:

 1import logging
2
3logger = logging.getLogging() # 獲取Logger對象
4handler = logging.FileHandler('output.log', mode='a', encoding=None, delay=False)
5formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s',
6                              datefmt='%Y-%m-%d %H:%M:%S',
7                              style='%')
8handler.setFormatter(formatter) # handler對象設置格式
9handler.setLevel(logging.DEBUG)# handler設置日誌級別
10
11logger.addHandler(handler) # 添加handler對象
複製代碼

3.3 Filter類

Filter實例用於執行日誌記錄的任意篩選。
LoggersHandlers能夠根據須要使用篩選器實例篩選記錄.
logging標準庫只提供了一個base filter,其構造函數__init__接收name,默認的行爲是名爲namelogger及其子logger的消息能經過過濾器,其他的被過濾掉。

 1class Filter(object):
2    """
3    Filter instances are used to perform arbitrary filtering of LogRecords.
4    """

5    def __init__(self, name=''):
6        """
7        Initialize a filter.
8
9        Initialize with the name of the logger which, together with its
10        children, will have its events allowed through the filter. If no
11        name is specified, allow every event.
12        """

13        self.name = name
14        self.nlen = len(name)
複製代碼

3.4 Formatter類

Formatter對象用於配置日誌信息的最終順序、結構和內容。與logging.Handler基類不一樣的是,應用代碼能夠直接實例化Formatter類。

Formatter類的構造方法定義以下:
logging.Formatter.__init__(fmt=None, datefmt=None, style='%')

該方法可接收3個可選參數:

  • fmt:指定消息格式化字符串,若是不指定該參數則默認使用message的原始值
  • datefmt:指定日期格式字符串,若是不指定,則默認使用"%Y-%m-%d %H:%M:%S"
  • style:可取值爲'%', '{'和'$',若是不指定,則默認使用'%'
格式 含義
%(levelno)s 打印日誌級別的數值
%(levelname)s 打印日誌級別名稱
%(pathname)s 打印當前執行程序的路徑
%(filename)s 打印當前執行程序名
%(funcName)s 打印日誌的當前函數
%(lineno)d 打印日誌的當前行號
%(asctime)s 打印日誌的時間
%(thread)d 打印線程ID
%(message)s 打印日誌信息
%(process)s 當前進程,進程ID
%(module)s 調用日誌輸出函數的模塊名,filename的名稱部分,不包含後綴
%(msecs)d 日誌事件發生事件的毫秒部分。logging.basicConfig()中用參數datefmt將會去掉asctime中產生的毫秒部分,能夠用這個加上。

通常直接使用logging.Formatter(fmt, datefmt)

1import logging
2fmt = "%(asctime)s [%(filename)s:%(lineno)d] %(levelname)s: %(message)s"
3datefmt="%Y-%m-%d %H:%M:%S"
4logFormatter = logging.Formatter(fmt, datefmt)
複製代碼

4、使用示例

該部分主要展現如何使用logging模塊記錄日誌信息的使用方法。

默認的輸出格式以下:

在這裏插入圖片描述
在這裏插入圖片描述

示例:
在這裏插入圖片描述
在這裏插入圖片描述

logging模塊如何使用呢?下面介紹幾種經常使用的使用方式:

一是使用logging的對外函數接口;二是使用basicConfig()方法,該方法可以知足基本的使用需求;三是經過建立Logger對象,能夠進行更加複雜的處理。

4.1 直接調用logging接口

最簡單的使用方法,就是直接調用logging標準庫的接口,如logging.debug()logging.info()等函數。
默認的日誌級別是WARNING,當等級大於等於WARNING才被跟蹤。

內部默認調用的是root.log(level, mas)函數

接口函數以下:

  • debug()
  • info()
  • warning()
  • error()
  • critical()

也能夠直接使用同一接口logging.log(),輸入級別及具體信息。

  • log(level, msg)level表示日誌級別,輸入日誌級別對應的整數或代碼,以下:
1  CRITICAL = 50
2  FATAL = CRITICAL
3  ERROR = 40
4  WARNING = 30
5  WARN = WARNING
6  INFO = 20
7  DEBUG = 10
8  NOTSET = 0
複製代碼

這些接口函數內部實際調用的都是Logger類的對應函數。若是logger沒有handler時,可默認調用basicConfig()添加控制檯handler
如,logging.info()函數內部調用root.info()函數,以下

1def info(msg, *args, **kwargs):
2    """
3    Log a message with severity 'INFO' on the root logger. If the logger has
4    no handlers, call basicConfig() to add a console handler with a pre-defined
5    format.
6    """

7    if len(root.handlers) == 0:
8        basicConfig()
9    root.info(msg, *args, **kwargs)
複製代碼

示例以下:

 1import logging
2logging.warning('this is a warning info.')
3logging.error('this is a error info.')
4logging.debug('this is a debuginfo.')
5# 輸出
6WARNING:root:this is a warning info.
7ERROR:root:this is a error info.
8
9logging.log(20'this is a info msg.')
10logging.log(30'this is a warn msg.')
11# 輸出:
12WARNING:root:this is a warn msg.
複製代碼

記錄具體異常信息

當發生異常時,直接使用無參數的debug(), info(), warning(), error(), critical()方法並不能記錄異常信息。

咱們看一下各個接口的定義及參數:

 1# 普通接口
2def warning(msg, *args, **kwargs)
3# 內部調用以下函數:
4self._log(WARNING, msg, args, **kwargs)
5
6# 統一接口
7def log(level, msg, *args, **kwargs)
8# 內部調用以下函數:
9self._log(level, msg, args, **kwargs)
10
11exception函數,參數中默認exc_infoTrue
12def exception(msg, *args, exc_info=True, **kwargs):

13   error(msg, *args, exc_info=exc_info, **kwargs)
14# 內部調用以下函數:
15self._log(ERROR, msg, args, **kwargs)
複製代碼

由上面代碼可見,其內部都是調用函數Logger._log(level, msg, args, **kwargs)。不一樣的是參數,如level日誌級別。
函數Logger._log()的定義以下:

1def _log(self, level, msg, args, exc_info=None, extra=None, stack_info=False)
2

複製代碼

可見,其除了levelmsg之外,還有參數exc_info。該參數用來控制是否打印具體信息。

函數exception()就等於error(msg, exc_info=True)

所以:
記錄異常信息的方法

  • 設置exc_info參數爲True,指示是否打印執行信息
  • 或者使用exception()方法,同時記錄當前的堆棧追蹤(僅從異常處理程度調用此方法)
  • 還可使用log()方法,可是要設置日誌級別和exce_info參數。

logger.log(level, msg, exc_info=True)是各個接口函數的統一調用方式。

示例代碼:

 1import logging
2
3logging.basicConfig(filename="test.log", filemode="w", format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%d-%M-%Y %H:%M:%S", level=logging.DEBUG)
4a = 5
5b = 0
6try:
7    c = a / b
8except Exception as e:
9    # 下面三種方式三選一,推薦使用第一種
10    logging.exception("Exception occurred")
11    logging.error("Exception occurred", exc_info=True)
12    logging.log(level=logging.DEBUG, msg="Exception occurred", exc_info=True)
複製代碼

輸出文件test.log的內容:

在這裏插入圖片描述
在這裏插入圖片描述

4.2 使用basicConfig()函數

使用basicConfig()方法就可以知足基本的使用須要,若是方法沒有傳入參數,會根據默認的配置建立Logger對象,默認的日誌級別被設置爲WARNING
默認的日誌輸出格式:

WARNING root message
日誌級別 Logger實例 日誌信息

函數定義:
def basicConfig(**kwargs)

該函數可選的參數以下表所示:

參數名稱 參數描述
filename 日誌輸出到文件的文件名
filemode 文件模式,r[+]w[+]a[+]
format 日誌輸出的格式
datefmt 日誌附帶日期時間的格式
style 格式佔位符,默認爲「%」「{}」
level 設置日誌輸出級別
stream 定義輸出流,用來初始化 StreamHandler對象,不能和 filename參數一塊兒使用,不然會ValueError異常
handles 定義處理器,用來建立Handler對象,不能和filename,stream參數一塊兒使用,不然也會拋出ValueError異常
  • stream輸出流不與filename輸出文件一塊兒使用
  • handler處理器不與stream輸出流或filename輸出文件一塊兒用
  • streamfilenamehandler互相排斥
  • 若想將日誌信息同時輸出到文件和控制檯,則須要使用Logger處理器增長對應的處理方法。

basicConfig()方法能夠實現將日誌信息輸出到文件中或者輸出到定義的輸出流中。

  • 輸出到文件中,能夠經過filename參數,或者經過handler處理器建立相應文件對象實現
    • 內部建立`FileHandle()`對象
  • 打印到輸出流中,使用默認參數便可
    • 內部建立`StreamHandler()`對象

其中,format指定輸出的格式和內容,format能夠輸出不少有用信息,具體格式見Formatter類

該方法至關於顯示調用basicConfig()進行參數的配置,而直接調用logging.info()接口函數,若沒有handler時,是隱式調用basicConfig()的默認參數形式。

1)日誌信息打印到輸出流

 1import logging
2# 直接調用basicConfig()函數,使用默認參數
3logging.basicConfig()
4logging.debug('This is a debug message')
5logging.info('This is an info message')
6logging.warning('This is a warning message')
7logging.error('This is an error message')
8logging.critical('This is a critical message')
9
10# 輸出:(默認級別是WARNING)
11WARNING:root:This is a warning message
12ERROR:root:This is an error message
13CRITICAL:root:This is a critical message
複製代碼

2)格式化輸出

格式化輸出時間:
經過datefmt參數能夠格式化輸出log的時間。

經常使用的輸出格式以下:
format = '%(asctime)s - %(filename)s[line:%(lineno)d]- %(levelname)s: %(message)s'
該格式能夠輸出日誌的打印時間,輸出模塊及行號,日誌級別和輸出的日誌內容。

1import logging
2logging.basicConfig(format='%(asctime)s %(message)s', datefmt = '%Y-%m-%d %I:%M:%S %p')
3logging.warning('is when this event was occurred.')
4
5# 輸出結果
62019-10-15 04:03:17 PM is when this event was occurred.
複製代碼

3) 將日誌輸出到指定文件
指定filenamefilemode參數,可將日誌內容輸出到指定文件,示例代碼以下:

1import logging
2
3logging.basicConfig(filename='test.log', filemode='w', format="%(asctime)s %(name)s:%(levelname)s:%(message)s", datefmt="%d-%M-%Y %H:%M:%S", level=logging.DEBUG)
4logging.debug('This is a debug message')
5logging.info('This is an info message')
6logging.warning('This is a warning message')
7logging.error('This is an error message')
複製代碼

生成的日誌文件test.log,內容以下:

在這裏插入圖片描述
在這裏插入圖片描述

4.3 一步步配置Logger

basicConfig函數提供了一種較爲簡便的使用日誌的方式,若是想要獲取更加複雜的使用,則須要本身一步步配置來實現。

配置邏輯:

  • 一個logger對象能夠添加多個handler對象,經過addHandler()函數
  • 每一個handler對象能夠有一個Formatter對象來指定格式,經過setFormatter()函數
  • handlerlogger對象都須要設置一個日誌等級,經過setLevel()函數
  • 根據須要loggerhandler對象能夠添加多個Filter對象,經過addFilter()函數

示例:

 1import logging
2
3logger = logging.getLogger(__name__)
4logger.setLevel(level=logging.INFO)
5
6handler = logging.FileHandler('output.log', mode='a', encoding=None, delay=False)
7formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s',
8                                datefmt='%Y-%m-%d %H:%M:%S',
9                                style='%')
10handler.setFormatter(formatter)
11handler.setLevel(logging.DEBUG)
12handler.set_name('output-log')
13
14logger.addHandler(handler)
15
16a=0
17try:
18    res = 100 / a
19except:
20    logger.error('Divisor is equal to 0.', exc_info=True)
複製代碼

將日誌同時輸出到屏幕和文件

 1import logging
2logger = logging.getLogger(__name__)
3logger.setLevel(level = logging.DEBUG)
4handler = logging.FileHandler("log.txt")
5handler.setLevel(logging.INFO)
6formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s')
7handler.setFormatter(formatter)
8
9console = logging.StreamHandler()
10console.setLevel(logging.INFO)
11
12logger.addHandler(handler)
13logger.addHandler(console)
14
15logger.info("Start print log")
16logger.debug("Do something")
17logger.warning("Something maybe fail.")
18logger.info("Finish")
複製代碼

log.txt文件和控制檯都可看到輸出,控制檯的輸出,其中文件中內容(有格式)以下:

在這裏插入圖片描述
在這裏插入圖片描述

經過這段代碼能夠看出, logging有一個日誌處理的主對象( logger=logging.getLogger()),其餘的處理方法均是經過 addHandler添加進去。

4.4 經過dictConfig配置

經過dictConfig配置方法是經過python代碼構建一個dict對象,也能夠經過JSONyaml文件來進行配置。
這種方式使用起來更加靈活,強大。咱們能夠把不少的數據轉換成自字典形式,而後將他們填充到一個配置字典中。

具體如何轉換能夠參考logging.config.py文件。

4.4.1 dictConfig()

該函數能夠從一個字典對象中獲取日誌配置信息,config參數就是這個字典對象。

定義以下:

1def dictConfig(config):
2    """Configure logging using a dictionary."""
3    dictConfigClass(config).configure()
複製代碼

如使用YAML格式的文件類配置(配置內容見下方示例),則使用示例:

 1import logging
2import logging.config
3import yaml
4
5with open('logging.yml''r'as f_config:
6    dict_cfg = yaml.load(f_config)
7logging.config.dictConfig(dict_cfg)
8
9logger = logging.getLogger('console')
10logger.debug('debug msg')
複製代碼

4.4.2 配置規則

key名稱 描述
version 必選項,整數值,表示配置格式版本,當前惟一可用值是1
formatters 可選項,其值是字典對象,該字典對象每一個元素的key爲要定義的格式器名稱,value爲格式器的配置信息組成的dict。通常會配置format,用於指定輸出字符串的格式,datefmt用於指定輸出的時間字符串格式,默認爲%Y-%m-%d %H:%M:%S
filters 可選項,其值是字典對象,該字典對象每一個元素的key爲要定義的過濾器名稱,value爲過濾器的配置信息組成的dict
handlers 可選項,其值是字典對象,該字典對象每一個元素的key爲要定義的處理器名稱,value爲處理器的配置信息組成的dict。如class(必選項), formatter, filters。其餘配置信息將會傳遞給class所指定的處理器類的構造函數。如使用logging.handlers.RotatingFileHandler,使用maxBytes, backupCount等參數。
loggers 可選項,其值是字典對象,該字典對象每一個元素的key爲要定義的日誌器名稱,value爲日誌器的配置信息組成的dict。如level, handler, filter
root 可選項,這是root logger的配置項,其值是字典對象。除非在定義其它logger時明確指定propagate值爲no,不然root logger定義的handlers都會被做用到其它logger上。
incremental 可選項,默認值爲False。該選項的意義在於,若是這裏定義的對象已經存在,那麼這裏對這些對象的定義是否應用到已存在的對象上。值爲False表示,已存在的對象將會被從新定義。

具體配置結構以下所示:

  • version: 必要參數,必須爲1

  • incremental:是否將此配置文件解釋爲現有配置的增量, 默認爲False

  • disable_existing_loggers:是否要禁用現有的非 root logger,默認爲True

  • handlers:字典形式

    • class:必須有,所使用的handler類,如logging.handlers.RotatingFileHandler
    • level:(可選),handler的等級
    • formatter:(可選),當前handlerformatterid
    • filters:(可選),當前handlerfiltersid列表
  • loggers:字典形式

    • level:(可選),logger的等級
    • propagate:(可選):默認值爲1,表示將消息傳遞給父loggerhandler進行處理。
    • filters:(可選)
    • handlers:(可選) ,當前loggerhandlersid列表
    • qualname:代碼中使用logging.getLogger()時,讀取的就是qualname這個選項。
  • root:這是root logger的配置項

    • level:日誌等級
    • handlers :當前root loggerhandlersid列表

4.4.3 配置示例

 1version:1
2root:
3    level:DEBUG
4    handlers:[filehandler, ]
5loggers:
6    console:
7        level:WARNING
8        handlers:[consolehandler,]
9        propagate:1
10handlers:
11    filehandler:
12        class:logging.FileHandler
13        filename:logs/sys.log
14        level:WARNING
15        formatter:fileformatter
16    consolehandler:
17        class:logging.StreamHandler
18        stream:ext://sys.stdout
19        level:DEBUG
20        formatter:consoleformatter
21formatters:
22    fileformatter:
23        format:'%(asctime)s [%(name)s][%(levelname)s]:%(message)s'
24    consoleformatter:
25        format:'%(asctime)s[%(levelname)s]:%(message)s'
複製代碼

外部對象訪問:外部對象是指不能直接進行訪問,須要import導入的對象,這時候須要加一個ext://前綴以便識別,而後系統就會import這個前綴後面的內容。

參考資料:
Python日誌庫logging總結-多是目前爲止將logging庫總結的最好的一篇文章
python基礎學習十 logging模塊詳細使用【轉載】 - louis_w - 博客園
Python之路(第十七篇)logging模塊 - Nicholas- - 博客園

相關文章
相關標籤/搜索