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
模塊的相關知識及具體使用。
當前介紹該日誌模塊的文章有不少,之因此還要進行記錄,一方面是由於沒有看到系統的介紹,二是經過梳理此部份內容,作到不止會用,還明白內部函數調用。服務器
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
官方的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
對象。前面講logging
流程的時候,提到幾個概念:Logger
,Handler
,Filter
,Formatter
。ui
Logger
對象有3個任務要作:
info, debug
等方法,使應用程序能夠在運行時記錄日誌消息Filter
對象來決定要對哪些日誌進行後續處理handlers
一個系統只有一個根Logger
對象,而且該對象不能被直接實例化。
經過調用
logging.getLogger(name)
函數建立Logger
類對象。
Logger
對象最經常使用的方法有兩類:(1)配置方法,(2)消息發送方法
Logger
對象能夠設置多個Handler
對象和Filter
對象,Handler
對象能夠設置Formatter
對象。Formatter
對象用來設置消息的具體輸出格式。
方法 | 描述 |
---|---|
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
都是'.'
前面的logger
的children
,例如,有一個名稱爲 foo
的logger
,其它名稱分別爲foo.bar, foo.bar.baz
和 foo.bam
都是 foo
的後代。
logger
有一個"有效等級(effective level
)"的概念。若是一個logger上沒有被明確設置一個level,那麼該logger就是使用它parent的level;若是它的parent
也沒有明確設置level
則繼續向上查找parent
的parent
的有效level
,依次類推,直到找到個一個明確設置了level
的祖先爲止。須要說明的是,root logger
老是會有一個明確的level
設置(默認爲 WARNING
)。當決定是否去處理一個已發生的事件時,logger
的有效等級將會被用來決定是否將該事件傳遞給該logger
的handlers
進行處理。
child loggers
在完成對日誌消息的處理後,默認會將日誌消息傳遞給與它們的祖先loggers
相關的handlers
。所以,咱們沒必要爲一個應用程序中所使用的全部loggers定義和配置handlers,只須要爲一個頂層的`logger`配置`handlers`,而後按照須要建立child loggers
就可足夠了。咱們也能夠經過將一個logger的propagate
屬性設置爲False來關閉這種傳遞機制。
日誌記錄的工做主要由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的子logger
。c1, 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
複製代碼
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 |
將日誌消息以GET 或POST 的方式發送給一個HTTP 服務器 |
logging.handlers.SMTPHandler |
將日誌消息發送給一個指定的email地址 |
logging.NullHandler |
該Handler 實例會忽略error messages ,一般被想使用logging 的library 開發者使用來避免'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對象
複製代碼
Filter
實例用於執行日誌記錄的任意篩選。Loggers
和Handlers
能夠根據須要使用篩選器實例篩選記錄.logging
標準庫只提供了一個base filter
,其構造函數__init__
接收name
,默認的行爲是名爲name
的logger
及其子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)
複製代碼
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)
複製代碼
該部分主要展現如何使用
logging
模塊記錄日誌信息的使用方法。
默認的輸出格式以下:
logging
模塊如何使用呢?下面介紹幾種經常使用的使用方式:
一是使用logging
的對外函數接口;二是使用basicConfig()
方法,該方法可以知足基本的使用需求;三是經過建立Logger
對象,能夠進行更加複雜的處理。
最簡單的使用方法,就是直接調用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
11# exception函數,參數中默認exc_info爲True
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
複製代碼
可見,其除了level
, msg
之外,還有參數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
的內容:
使用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
輸出文件一塊兒用- 即
stream
、filename
和handler
互相排斥- 若想將日誌信息同時輸出到文件和控制檯,則須要使用
Logger
處理器增長對應的處理方法。
basicConfig()
方法能夠實現將日誌信息輸出到文件中或者輸出到定義的輸出流中。
filename
參數,或者經過handler
處理器建立相應文件對象實現
其中,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) 將日誌輸出到指定文件
指定filename
, filemode
參數,可將日誌內容輸出到指定文件,示例代碼以下:
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
,內容以下:
basicConfig
函數提供了一種較爲簡便的使用日誌的方式,若是想要獲取更加複雜的使用,則須要本身一步步配置來實現。
配置邏輯:
logger
對象能夠添加多個handler
對象,經過addHandler()
函數handler
對象能夠有一個Formatter
對象來指定格式,經過setFormatter()
函數handler
和logger
對象都須要設置一個日誌等級,經過setLevel()
函數logger
和handler
對象能夠添加多個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
添加進去。
經過dictConfig
配置方法是經過python代碼構建一個dict
對象,也能夠經過JSON
或yaml
文件來進行配置。
這種方式使用起來更加靈活,強大。咱們能夠把不少的數據轉換成自字典形式,而後將他們填充到一個配置字典中。
具體如何轉換能夠參考logging.config.py
文件。
該函數能夠從一個字典對象中獲取日誌配置信息,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')
複製代碼
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
:(可選),當前handler
的formatter
的id
filters
:(可選),當前handler
的filters
的id
列表loggers
:字典形式
level
:(可選),logger
的等級propagate
:(可選):默認值爲1,表示將消息傳遞給父logger
的handler
進行處理。filters
:(可選)handlers
:(可選) ,當前logger
的handlers
的id
列表qualname
:代碼中使用logging.getLogger()
時,讀取的就是qualname
這個選項。root
:這是root logger
的配置項
level
:日誌等級handlers
:當前root logger
的handlers
的id
列表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- - 博客園