日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python学习笔记(二十八)日志模块

發(fā)布時(shí)間:2023/12/13 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python学习笔记(二十八)日志模块 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們?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ù)指定文件名就行了。

logging.basicConfig(level=logging.ERROR,#控制臺(tái)打印的日志級(jí)別filename='log.txt',#文件名filemode='a',#模式,有w和a,w就是寫(xiě)模式,每次都會(huì)重新寫(xiě)日志,覆蓋之前的日志#a是追加模式,默認(rèn)如果不寫(xiě)的話,就是追加模式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ò)誤信息')

加上文件名之后就會(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)加一些配置

import logging from logging import handlers class MyLogger():def __init__(self,file_name,level='info',backCount=5,when='M'):logger = logging.getLogger() # 先實(shí)例化一個(gè)logger對(duì)象,先創(chuàng)建一個(gè)辦公室logger.setLevel(self.get_level(level)) # 設(shè)置日志的級(jí)別的人cl = logging.StreamHandler() # 負(fù)責(zé)往控制臺(tái)輸出的人bl = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding='utf-8')fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s') #時(shí)間 #打印哪個(gè)python文件的第幾行 #日志級(jí)別 #打印的信息cl.setFormatter(fmt) # 設(shè)置控制臺(tái)輸出的日志格式bl.setFormatter(fmt) # 設(shè)置文件里面寫(xiě)入的日志格式logger.addHandler(cl)logger.addHandler(bl)self.logger = loggerdef get_level(self,str):level = {'debug':logging.DEBUG,'info':logging.INFO,'warn':logging.WARNING,'error':logging.ERROR}str = str.lower()return level.get(str) if __name__ == '__main__':lw_log = MyLogger('lw.log','debug',when='M')lw_log.logger.warning('哈哈哈')

由于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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。