Python的logging模塊提供了通用的日志系統(tǒng)性锭,支持debug毙替、info玖瘸、warn、error庆猫、critical多種級(jí)別日志,可以方便第三方模塊或者應(yīng)用使用绅络。
1. 日志模塊loging的簡(jiǎn)單案例
#! /usr/bin/env python
#? -*-? coding:utf-8? -*-
import logging
? ? ? ? logging.basicConfig(filename= 'logger.log',? level=logging.ERROR)
? ? ? ? logging.debug('debug message')
? ? ? ? logging.info('info message')
? ? ? ? logging.warn('warn message')
? ? ? ? logging.error('error message')
? ? ? ? logging.critical('critical message')
logging.info等可以在程序的合適地方打印阅悍,在logger.log文件中打印如下:
? ? ? ? ERROR:root:error message
? ? ? ? CRITICAL:root:critical message
因?yàn)橥ㄟ^(guò)level=logging.ERROR設(shè)置日志級(jí)別為ERROR好渠,所以輸出日志級(jí)別大于ERROR的日志信息。
2. logging的重要概念
1. Logger
Logger是一個(gè)樹形層級(jí)結(jié)構(gòu)节视,在使用debug拳锚、info、warn寻行、error霍掺、critical之前必須創(chuàng)建Logger實(shí)例,即創(chuàng)建一個(gè)記錄器拌蜘,如果沒(méi)有顯式地進(jìn)行創(chuàng)建杆烁,則默認(rèn)創(chuàng)建一個(gè)root logger,應(yīng)用默認(rèn)的日志級(jí)別(WARN)简卧、處理器Handler(StreamHandler將日志輸出在標(biāo)準(zhǔn)輸出設(shè)備上)和格式化器Formatter(默認(rèn)的格式為ERROR:root:error message日志級(jí)別:實(shí)例名稱:日志信息)兔魂。
創(chuàng)建方法:
logger=logging.getLogger(logger_name)
創(chuàng)建Logger實(shí)例后,使用以下方法進(jìn)行日志級(jí)別設(shè)置举娩,增加處理器Handler析校。
? logger.setLevel(logging.ERROR):設(shè)置日志級(jí)別為ERROR,即只有日志級(jí)別大于等于ERROR的日志才會(huì)輸出铜涉。
? logger.addHandler(handler_name):為L(zhǎng)ogger實(shí)例增加一個(gè)處理器智玻。
? logger.removeHandler(handler_name):為L(zhǎng)ogger實(shí)例刪除一個(gè)處理器。
Logger可以包含一個(gè)或多個(gè)Handler和Filter芙代,也就是說(shuō)Logger與Handler或Fitler是一對(duì)多的關(guān)系吊奢;一個(gè)Logger實(shí)例可以新增多個(gè)Handler,一個(gè)Handler可以新增多個(gè)Formatter或多個(gè)Filter纹烹,而且日志級(jí)別將會(huì)繼承页滚。
2. Handler
Handler處理器常用類型有StreamHandler、FileHandler铺呵、NullHandler裹驰,點(diǎn)擊查看參數(shù)使用說(shuō)明。
StreamHandler創(chuàng)建方法:? sh = logging.StreamHandler(stream=None)
創(chuàng)建StreamHandler后陪蜻,設(shè)置日志級(jí)別邦马,設(shè)置格式化器Formatter,增加或刪除過(guò)濾器Filter宴卖,使用例子參考網(wǎng)上案例滋将。
? sh.setLevel(logging.WARN):指定日志級(jí)別,低于WARN級(jí)別的日志將被忽略症昏。
? sh.setFormatter(formatter_name):設(shè)置一個(gè)格式化器formatter随闽。
? sh.addFilter(filter_name):增加一個(gè)過(guò)濾器,可以增加多個(gè)肝谭。
? sh.removeFilter(filter_name):刪除一個(gè)過(guò)濾器掘宪。
FileHandler創(chuàng)建方法:
fh = logging.FileHandler(filename, mode='a', encoding=None, delay=False)
NullHandler創(chuàng)建方法:logging.NullHandler
3.Filter
Handler和Logger可以使用Filter來(lái)完成比級(jí)別更復(fù)雜的過(guò)濾蛾扇。Filter基類只允許特定Logger層次以下的事件。例如魏滚,用’A.B’初始化的Filter允許Logger? 'A.B'镀首、 'A.B.C'、 'A. B.C.D'鼠次、 'A.B.D’等記錄的事件更哄,logger'A.BB'、'B.A.B’等就不行腥寇。如果用空字符串來(lái)初始化成翩,所有的事件都接受。
創(chuàng)建方法:filter = logging.Filter(name='')
備注:A.B是啥?看不懂
4.Formatter
Formatter對(duì)象可以設(shè)置日志信息的規(guī)則赦役、結(jié)構(gòu)和內(nèi)容麻敌,以及時(shí)間格式。
創(chuàng)建方法:formatter = logging.Formatter(fmt=None, datefmt=None)
其中掂摔,fmt是消息的格式化字符串术羔,datefmt是日期字符串默認(rèn)使用ISO8601日期格式%Y-%m-%d %H:%M:%S。
3. logging模塊使用方法
1. import? logging
第一次導(dǎo)入logging模塊或使用reload函數(shù)重新導(dǎo)入logging模塊棒呛,logging模塊中的代碼將被執(zhí)行聂示,這個(gè)過(guò)程中將產(chǎn)生logging日志系統(tǒng)的默認(rèn)配置域携。
2. 自定義配置(可選)
logging.basicConfig(filename= 'logger.log', level=logging.ERROR)
logging.config.fileConfig("./logging.conf")
logging.config.dictConfig(config)
logging.config.listen(port=DEFAULT_LOGGING_CONFIG_PORT)
logging模塊支持配置方式:basicConfig簇秒、 dictConfig、fileConfig秀鞭、listen趋观。dictConfig通過(guò)一個(gè)字典配置Logger、Handler锋边、Filter 皱坛、Formatter;fileConfig通過(guò)一個(gè)文件進(jìn)行配置豆巨;listen則監(jiān)聽一個(gè)網(wǎng)絡(luò)端口剩辟,通過(guò)接收網(wǎng)絡(luò)數(shù)據(jù)來(lái)進(jìn)行配置。
常用的format格式如下
3. 創(chuàng)建一個(gè)Logger對(duì)象實(shí)例
用logging模塊的全局作用域中的getLogger函數(shù)來(lái)得到一個(gè)Logger對(duì)象實(shí)例往扔。
logger=logging.getLogger(logger_name)
4. 用Logger對(duì)象實(shí)例記錄日志
用Logger對(duì)象中的debug贩猎、info、error萍膛、warn吭服、critical等方法記錄日志信息。
logging.info('info message')
4. logging模塊處理流程
1)判斷日志的等級(jí)是否大于Logger對(duì)象的等級(jí)蝗罗,如果大于艇棕,則往下執(zhí)行蝌戒,否則,流程結(jié)束沼琉。
2)產(chǎn)生日志北苟。第一步,判斷是否有異常打瘪,如果有粹淋,則添加異常信息。第二步瑟慈,處理日志記錄方法(如debug桃移、info等)中的占位符,即一般的字符串格式化處理葛碧。
3)使用注冊(cè)到Logger對(duì)象中的Filters進(jìn)行過(guò)濾借杰。如果有多個(gè)過(guò)濾器,則依次過(guò)濾进泼;只要有一個(gè)過(guò)濾器返回假蔗衡,則過(guò)濾結(jié)束,且該日志信息將丟棄乳绕,不再處理绞惦,而處理流程也至此結(jié)束。否則洋措,處理流程往下執(zhí)行济蝉。
4)在當(dāng)前Logger對(duì)象中查找Handler,如果找不到任何Handler菠发,則往上到該Logger對(duì)象的父Logger中查找王滤;如果找到一個(gè)或多個(gè)Handler,則依次用Handler來(lái)處理日志信息滓鸠。但在每個(gè)Handler處理日志信息過(guò)程中雁乡,會(huì)首先判斷日志信息的等級(jí)是否大于該Handler的等級(jí),如果大于糜俗,則往下執(zhí)行(由Logger對(duì)象進(jìn)入Handler對(duì)象中)踱稍,否則,處理流程結(jié)束悠抹。
5)執(zhí)行Handler對(duì)象中的filter方法珠月,該方法會(huì)依次執(zhí)行注冊(cè)到該Handler對(duì)象中的Filter。如果有一個(gè)Filter判斷該日志信息為假锌钮,則此后的所有Filter都不再執(zhí)行桥温,而直接將該日志信息丟棄,處理流程結(jié)束梁丘。
6)使用Formatter類格式化最終的輸出結(jié)果侵浸。注:Formatter同“產(chǎn)生日志”第二步的字符串格式化不同旺韭,它會(huì)添加額外的信息,如日志產(chǎn)生的時(shí)間掏觉、產(chǎn)生日志的源代碼所在的源文件的路徑等区端。
7)真正地輸出日志信息(到網(wǎng)絡(luò)、文件澳腹、終端织盼、郵件等)。至于輸出到哪個(gè)目的地酱塔,由Handler的種類來(lái)決定沥邻。