python学习笔记(二十八)日志模块
我們?cè)趯?xiě)程序的時(shí)候經(jīng)常會(huì)打一些日志來(lái)幫助我們查找問(wèn)題,這次學(xué)習(xí)一下logging模塊,在python里面如何操作日志。
介紹一下logging模塊,logging模塊就是python里面用來(lái)操作日志的模塊,logging模塊中主要有4個(gè)類(lèi),分別負(fù)責(zé)不同的工作:
Logger 記錄器,暴露了應(yīng)用程序代碼能直接使用的接口;簡(jiǎn)單點(diǎn)說(shuō)就是一個(gè)創(chuàng)建一個(gè)辦公室,讓人在里頭工作?
Handler 處理器,將(記錄器產(chǎn)生的)日志記錄發(fā)送至合適的目的地;這個(gè)簡(jiǎn)單點(diǎn)說(shuō)就是辦事的人,你可以指定是讓在控制輸出日志,還是在文件里面打印日志,常用的有4種:?
????????????????StreamHandler 控制臺(tái)輸出?
????????????????FileHandler 文件輸出
????????????????下面兩種需要導(dǎo)入
? ? ? ? ? ? ? ? ? ? ? ? handlers
? ? ? ? ? ? ? ? ? ? ? ? from logging import handlers?
? ? ? ? ? ? ? ? ? ? ? ? TimedRotatingFileHandler 按照時(shí)間自動(dòng)分割日志文件?
? ? ? ? ? ? ? ? ? ? ? ? RotatingFileHandler 按照大小自動(dòng)分割日志文件,一旦達(dá)到指定的大小重新生成文件?
? ? ? ? ? ? ? ? ? ? ? ? Filter過(guò)濾器,提供了更好的粒度控制,它可以決定輸出哪些日志記錄。(不常用)?
? ? ? ? ? ? ? ? ? ? ? ? Formatter格式化器,指明了最終輸出中日志記錄的布局。指定輸出日志的格式
import logging from logging import handlers #只在控制臺(tái)打印日志 logging.basicConfig(level=logging.ERROR,#控制臺(tái)打印的日志級(jí)別format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'#日志格式) logging.debug('debug級(jí)別,最低級(jí)別,一般開(kāi)發(fā)人員用來(lái)打印一些調(diào)試信息') logging.info('info級(jí)別,正常輸出信息,一般用來(lái)打印一些正常的操作') logging.warning('waring級(jí)別,一般用來(lái)打印警信息') logging.error('error級(jí)別,一般用來(lái)打印一些錯(cuò)誤信息') logging.critical('critical級(jí)別,一般用來(lái)打印一些致命的錯(cuò)誤信息')日志級(jí)別 debug < info < warning < error < critical
設(shè)置了日志級(jí)別之后,會(huì)打印該級(jí)別以及比該級(jí)別高的所有日志,舉個(gè)例子,如果日志級(jí)別是warning,那么就會(huì)打印warning、error、critical,這三個(gè)級(jí)別的日志,不會(huì)打印debug和info級(jí)別的,如果是debug,最低級(jí)別的日志,那么所有的日志都會(huì)打印。
上面的只是在控制臺(tái)打印日志,并沒(méi)有把日志寫(xiě)在文件里面,一般我們都會(huì)把日志寫(xiě)在日志文件里面,也很簡(jiǎn)單,只需要加個(gè)參數(shù)指定文件名就行了。
加上文件名之后就會(huì)發(fā)現(xiàn)控制臺(tái)不會(huì)輸出日志了,日志文件也產(chǎn)生了,那么如何既在控制臺(tái)輸出日志,也在文件中寫(xiě)入呢?
怎么實(shí)現(xiàn)呢,就得有個(gè)辦公室,里面塞倆人,一個(gè)給負(fù)責(zé)往控制臺(tái)輸出日志,一個(gè)負(fù)責(zé)寫(xiě)文件,你把他倆往辦公室一塞,他倆就能干活了。
import logging from logging import handlers logger = logging.getLogger('my_log') #先創(chuàng)建一個(gè)logger對(duì)象,相當(dāng)于這個(gè)辦公室,也就是上面說(shuō)的Logger logger.setLevel(logging.INFO)#設(shè)置日志的總級(jí)別 fh = logging.FileHandler('test.log',mode='a',encoding='utf-8')#創(chuàng)建一個(gè)文件處理器,也就是把日志寫(xiě)到文件里頭 fh.setLevel(logging.INFO)#設(shè)置文件輸出的級(jí)別 sh = logging.StreamHandler()#創(chuàng)建一個(gè)控制臺(tái)輸出的處理器,這兩個(gè)就是上面說(shuō)的Handler sh.setLevel(logging.INFO) #設(shè)置控制臺(tái)輸出的日志級(jí)別,這兩個(gè)級(jí)別都可以單獨(dú)設(shè)置,他們倆和logger的級(jí)別區(qū)別是如果logger設(shè)置的級(jí)別比里面的handler級(jí)別設(shè)置的高,那么就以logger的級(jí)別為準(zhǔn) th = handlers.TimedRotatingFileHandler('time',when='S',interval=1,backupCount=2) #指定間隔時(shí)間自動(dòng)生成文件的處理器 #interval是時(shí)間間隔,backupCount是備份文件的個(gè)數(shù),如果超過(guò)這個(gè)超過(guò)這個(gè)個(gè)數(shù),就會(huì)自動(dòng)刪除,when是間隔的時(shí)間單位,單位有以下幾種:# S 秒# M 分# H 小時(shí)、# D 天、# W 每星期(interval==0時(shí)代表星期一)# midnight 每天凌晨 th.setLevel(logging.INFO) formater = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s') #指定日志格式,上面咱們寫(xiě)了常用的格式,直接指定了就行了,這也就是咱們上面說(shuō)的Formatter sh.setFormatter(formater) fh.setFormatter(formater) th.setFormatter(formater) #設(shè)置兩個(gè)處理器的日志格式logger.addHandler(sh) logger.addHandler(fh) logger.addHandler(th) #把兩個(gè)handler加入容器里頭,相當(dāng)于把工作人員培訓(xùn)完了,你們可以上班了 logger.debug('debug級(jí)別,最低級(jí)別,一般開(kāi)發(fā)人員用來(lái)打印一些調(diào)試信息') logger.info('info級(jí)別,正常輸出信息,一般用來(lái)打印一些正常的操作') logger.warning('waring級(jí)別,一般用來(lái)打印警信息') logger.error('error級(jí)別,一般用來(lái)打印一些錯(cuò)誤信息') logger.critical('critical級(jí)別,一般用來(lái)打印一些致命的錯(cuò)誤信息')這樣logger這個(gè)日志辦公室已經(jīng)搞好了,咱們就可以直接用了,運(yùn)行完發(fā)現(xiàn)文件也產(chǎn)生了,控制臺(tái)也有日志。如果不設(shè)置日志級(jí)別的話,默認(rèn)級(jí)別是waring。
下面我們自己封裝一個(gè)類(lèi)來(lái)使用logging模塊,方便使用,默認(rèn)加一些配置
由于logging模塊用起來(lái)實(shí)在是費(fèi)勁,所以牛教授自己封裝了一個(gè)日志模塊供大家使用,非常方便,只需要直接pip install nnlog即可
使用例子如下代碼:
import nnlog log = nnlog.Logger(file_name='my.log',level='debug',when='D',backCount=5,interval=1) #file_name是日志文件名 #level是日志級(jí)別,如果不傳的話默認(rèn)是debug級(jí)別 #when是日志文件多久生成一個(gè),默認(rèn)是按天,S 秒、M 分、 H 小時(shí)、 D 天、 W 每星期 #backCount是備份幾個(gè)日志文件,默認(rèn)保留5天的 #interval是間隔多久生成一個(gè)日志文件,默認(rèn)是1天 log.debug('默認(rèn)日志級(jí)別是debug') log.info('info級(jí)別') log.warning('waring級(jí)別') log.error('error級(jí)別')log2 = nnlog.Logger(file_name='nn.log') #直接傳入文件名也是ok的,其他的就取默認(rèn)值了 log2.debug('test')?
轉(zhuǎn)載于:https://www.cnblogs.com/mululu/p/9121770.html
總結(jié)
以上是生活随笔為你收集整理的python学习笔记(二十八)日志模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java异常详解及如何处理
- 下一篇: Go Python 7: 2-Layer