日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

python 實現(xiàn)logging動態(tài)變更輸出日志文件名

瀏覽:28日期:2022-06-25 08:05:58

python作為一門非常容易上手的腳本語言,日志輸出更是簡單,logging模塊,簡單的設(shè)置配置和屬性,就能實現(xiàn)到控制臺輸出日志,在basicConfig()設(shè)置文件名,就能夠?qū)⑷罩拘畔懭胛募喼笔呛唵蔚讲荒茉俸唵巍?/p>

最近在項目中就遇到一個日志問題,使用python編寫的服務(wù)程序一直運行,連續(xù)處理一些任務(wù),每個任務(wù)的關(guān)鍵信息都需要輸出到文件中,便于維護人員查看,可是對于簡單實用logging來說,日志寫入文件非常簡單,由于服務(wù)程序連續(xù)運行,一直向一個文件記錄日志信息有些不妥,有常識的開發(fā)人員都知道,長時間的日志輸出會導致日志文件過大,可是如何在服務(wù)運行時,修改日志的輸出文件,以當天日期作為日志文件名。

代碼編寫環(huán)境:python3.4.3

1.logging.basicConfig()

首先,想到的是更改logging.basicConfig(filename=logfilename)參數(shù),來實現(xiàn)變更日志文件名的目的。編寫代碼如下:

log_fmt = ’%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s’for i in range(1,4): filename = str.format(’mylog%d.txt’ % i) logging.basicConfig(format=log_fmt, level=logging.DEBUG, filename=filename) logging.debug(’This is debug message’) logging.info(’This is info message’) logging.warning(’This is warning message’)

運行結(jié)果沒有達到預期的效果,只有日志文件mylog1.txt被創(chuàng)建,mylog2.txt和mylog3.txt都未被創(chuàng)建,連續(xù)3次的輸出的內(nèi)容都寫入mylog1.txt中。說明logging.basicConfig()設(shè)置屬性具有全局性,第一次設(shè)置之后,之后再設(shè)置將不再生效。查看官方文檔,也確實是如此。

logging.basicConfig(**kwargs)

Does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger. The functions debug(), info(), warning(), error() and critical() will call basicConfig() automatically if no handlers are defined for the root logger.

This function does nothing if the root logger already has handlers configured for it.

此路不通,只好用其他方法。

2.Handler對象

logging支持添加多個不同類型的handler對象,實現(xiàn)對控制臺(logging.StreamHandler)、文件(logging.FileHandler)等不同目標輸出日志。

logging支持的日志詳情見文檔logging.handlers

通過增加多個handler對象,可是實現(xiàn)同時在控制臺、文件同時輸出不同級別的日志信息。

# 默認配置logging寫入本地文件logging.basicConfig(level=logging.DEBUG, format=’%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s’, datefmt=’%a, %d %b %Y %H:%M:%S’, filename=’myapp2.log’, filemode=’w’)#定義一個StreamHandler,將INFO級別或更高的日志信息打印到標準錯誤,并將其添加到當前的日志處理對象。console = logging.StreamHandler()console.setLevel(logging.INFO)formatter = logging.Formatter(’%(name)-12s: %(levelname)-8s %(message)s’)console.setFormatter(formatter)logging.getLogger(’’).addHandler(console)logging.debug(’This is debug message’)logging.info(’This is info message’)logging.warning(’This is warning message’)

考慮實現(xiàn)簡單又能說明效果,寫入文件使用logging.basicConfig()設(shè)置,并添加輸出指向控制臺的流處理(StreamHandler)對象console,實現(xiàn)同時輸出日志。當然也可以反過來,默認設(shè)置控制臺輸出日志,之后創(chuàng)建文件對象(logging.FileHandler),并加入處理集合,實現(xiàn)同樣的效果。

logging.getLogger(’’)獲取的是名為’root’的默認根節(jié)點

同時,logging提供addHandler()的方法,自然也會有管理handler的方法。

延伸之前Handler的思路,我們可以實現(xiàn)對handler的動態(tài)管理,變更日志文件。每次需要變更輸出文件路徑前,使用handler管理清空原先的logging.FileHandler對象,重新創(chuàng)建一個新文件名的logging.FileHandler對象即可。

# 默認配置logging寫入本地文件logging.basicConfig(level=logging.DEBUG, format=’%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s’, datefmt=’%a, %d %b %Y %H:%M:%S’, filename=’myapp2.log’, filemode=’w’)#定義一個StreamHandler,將INFO級別或更高的日志信息打印到標準錯誤,并將其添加到當前的日志處理對象。console = logging.StreamHandler()console.setLevel(logging.INFO)formatter = logging.Formatter(’%(name)-12s: %(levelname)-8s %(message)s’)console.setFormatter(formatter)logging.getLogger(’’).addHandler(console)logging.debug(’This is debug message’)logging.info(’This is info message’)logging.warning(’This is warning message’)

使用for循環(huán)執(zhí)行3次處理,分別創(chuàng)建日志文件名稱為mylog1.txt, mylog2.tx, mylog3.txt,并寫入相同的內(nèi)容。執(zhí)行結(jié)果確實產(chǎn)生不同名稱的文件,日志內(nèi)容也正確寫入。

至此,已經(jīng)實現(xiàn)動態(tài)變更輸出文件日志名稱的功能。至于按照日志輸出文件名,只需要按照上述代碼的思路,將創(chuàng)建logging.FileHandler()的文件名參數(shù)變更就能達成目的。

簡單實現(xiàn)方案

瀏覽官方文檔logging.handlers一節(jié)內(nèi)容,python考慮到日志的常規(guī)使用場景,已經(jīng)封裝更為簡單的實現(xiàn)方案,TimedRotatingFileHandler,只需簡單的配置,即可實現(xiàn)對輸出日志文件的基本管理,靈活易用,代碼如下:

import logging, logging.handlersimport time’’’TimedRotatingFileHandler構(gòu)造函數(shù)聲明class logging.handlers.TimedRotatingFileHandler(filename, when=’h’, interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None)filename 日志文件名前綴when 日志名變更時間單位 ’S’ Seconds ’M’ Minutes ’H’ Hours ’D’ Days ’W0’-’W6’ Weekday (0=Monday) ’midnight’ Roll over at midnightinterval 間隔時間,是指等待N個when單位的時間后,自動重建文件backupCount 保留日志最大文件數(shù),超過限制,刪除最先創(chuàng)建的文件;默認值0,表示不限制。delay 延遲文件創(chuàng)建,直到第一次調(diào)用emit()方法創(chuàng)建日志文件atTime 在指定的時間(datetime.time格式)創(chuàng)建日志文件。’’’def test_TimedRotatingFileHandler(): # 定義日志輸出格式 fmt_str = ’%(asctime)s[level-%(levelname)s][%(name)s]:%(message)s’ # 初始化 logging.basicConfig() # 創(chuàng)建TimedRotatingFileHandler處理對象 # 間隔5(S)創(chuàng)建新的名稱為myLog%Y%m%d_%H%M%S.log的文件,并一直占用myLog文件。 fileshandle = logging.handlers.TimedRotatingFileHandler(’myLog’, when=’S’, interval=5, backupCount=3) # 設(shè)置日志文件后綴,以當前時間作為日志文件后綴名。 fileshandle.suffix = '%Y%m%d_%H%M%S.log' # 設(shè)置日志輸出級別和格式 fileshandle.setLevel(logging.DEBUG) formatter = logging.Formatter(fmt_str) fileshandle.setFormatter(formatter) # 添加到日志處理對象集合 logging.getLogger(’’).addHandler(fileshandle)if __name__ == ’__main__’: test_TimedRotatingFileHandler() # 測試在200s內(nèi)創(chuàng)建文件多個日志文件 for i in range(0, 100): logging.debug('logging.debug') logging.info('logging.info') logging.warning('logging.warning') logging.error('logging.error') time.sleep(2)

補充:使用Python的logging.config.fileConfig配置日志

Python的logging.config.fileConfig方式配置日志,通過解析conf配置文件實現(xiàn)。文件 logglogging.conf 配置如下:

[loggers]keys=root,fileLogger,rotatingFileLogger [handlers]keys=consoleHandler,fileHandler,rotatingFileHandler [formatters]keys=simpleFormatter [logger_root]level=DEBUGhandlers=consoleHandler [logger_fileLogger]level=DEBUG# 該logger中配置的handlerhandlers=fileHandler# logger 的名稱qualname=fileLoggerpropagate=0 [logger_rotatingFileLogger]level=DEBUG# 這樣配置,rotatingFileLogger中就同時配置了consoleHandler,rotatingFileHandler# consoleHandler 負責將日志輸出到控制臺# rotatingFileHandler 負責將日志輸出保存到文件中handlers=consoleHandler,rotatingFileHandlerqualname=rotatingFileLoggerpropagate=0 [handler_consoleHandler]class=StreamHandlerlevel=DEBUGformatter=simpleFormatterargs=(sys.stdout,) [handler_fileHandler]class=FileHandlerlevel=DEBUGformatter=simpleFormatterargs=(’logs/logging.log’, ’a’) [handler_rotatingFileHandler]class=handlers.RotatingFileHandlerlevel=WARNINGformatter=simpleFormatterargs=('logs/rotating_logging.log', 'a', 1*1024*1024, 5) [formatter_simpleFormatter]#format=%(asctime)s - %(name)s - %(levelname)s - %(message)sformat=%(asctime)s - %(module)s - %(thread)d - %(levelname)s : %(message)sdatefmt=%Y-%m-%d %H:%M:%S以上配置文件主要包含以下幾部分:

loggers : 配置logger信息。必須包含一個名字叫做root的logger,當使用無參函數(shù)logging.getLogger()時,默認返回root這個logger,其他自定義logger可以通過 logging.getLogger('fileLogger') 方式進行調(diào)用

handlers:定義聲明handlers信息。常用的handlers包括 StreamHandler(僅將日志輸出到kong控制臺)、FileHandler(將日志信息輸出保存到文件)、RotaRotatingFileHandler(將日志輸出保存到文件中,并設(shè)置單個日志wenj文件的大小和日志文件個數(shù))

formatter : 設(shè)置日志格式

logger_xxx : 對loggers中聲明的logger進行逐個配置,且要一一對應(yīng)

handler_xxx : 對handlers中聲明的handler進行逐個配置,且要一一對應(yīng)

formatter_xxx : 對聲明的formatterjinx進行配置

代碼示例

logging.config.fileConfig(“l(fā)ogging.conf”) # 輸出日志到控制臺,獲取的是root對應(yīng)的loggerconsole_logger = logging.getLogger() # 輸出日志到單個文件file_logger = logging.getLogger(name='fileLogger') # rotatingFileLogger中額consoleHandler輸出到控制臺,rotatingHandler輸出日志到文件rotating_logger = logging.getLogger(name='rotatingFileLogger')友情提示

進行以上配置后,在項目中需要進行日志輸出的地方通過logging.getLogger()方式就可以獲取到du應(yīng)的logger,然后就可以使用logger.info('xxx')jinx進行日志輸出了。

使用這種方式配置日志,一定要在項目的入口函數(shù)中就調(diào)用 logging.config.fileConfig(“l(fā)ogging.conf”)函數(shù),因為 logging.conf 文件中,在handler中配置的是日志文件的相對地址,如果在其他代碼文件中進行調(diào)用,由于相對地址的原因,將導致日志文件會出現(xiàn)在yixi意想不到的位置。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
巨乳诱惑日韩免费av| 国产一区久久| 爽好多水快深点欧美视频| 丝袜美腿诱惑一区二区三区 | 欧美亚洲三级| 日韩国产在线观看一区| 亚州欧美在线| 日本成人在线视频网站| 久久国产高清| 久久亚洲电影| 日本a级不卡| 国产欧美久久一区二区三区| 国产乱子精品一区二区在线观看| 国产亚洲久久| 国产一区二区三区91| 国产在线看片免费视频在线观看| 亚洲精品**中文毛片| 中文一区一区三区免费在线观| 免费在线观看不卡| 亚洲免费福利一区| 国产乱码精品| 国产精品精品| 亚洲一级淫片| 日韩综合一区二区三区| 国产伦精品一区二区三区在线播放| 欧美国产极品| 国精品产品一区| 日韩中文在线电影| 不卡中文字幕| 亚洲精品护士| 国产精品激情电影| 黑人精品一区| 欧美日韩日本国产亚洲在线| 综合色一区二区| 国产精品久久亚洲不卡| 天堂а√在线最新版中文在线| 国产尤物精品| 国产日韩中文在线中文字幕| 精品视频一区二区三区在线观看| 精品亚洲美女网站| 日韩精品一区第一页| 国产欧美日韩精品高清二区综合区| 国产精品99在线观看| 亚洲欧美久久久| 欧美精品1区| 国产高清久久| 国产精品欧美三级在线观看 | 国产成年精品| 亚洲作爱视频| 国产精品天堂蜜av在线播放| 国产亚洲一区二区手机在线观看 | 一二三区精品| 麻豆一区二区三区| 九九色在线视频| 日韩欧美中文字幕一区二区三区| 欧美黄色一区二区| 欧美日韩精品一本二本三本| 国产精品xxx在线观看| 99成人超碰| 日韩福利视频导航| 国产一卡不卡| 欧美日韩色图| 国产精品综合| 激情婷婷综合| 欧美一区网站| 99久久久久国产精品| 欧美有码在线| 欧美精品一区二区久久| 国产精品任我爽爆在线播放| 在线一区电影| 久久精品国产亚洲aⅴ| 欧美另类综合| 免费日韩成人| 蜜桃视频一区二区| 国产一区二区三区探花| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲福利专区| 国内精品美女在线观看| 日韩一区二区三区精品| 日韩伦理福利| 国产欧美午夜| 蜜臀精品久久久久久蜜臀| 97精品国产福利一区二区三区| 天堂va在线高清一区| 精品一区欧美| 欧美成人a交片免费看| 国产欧美69| 亚洲三级在线| 女人天堂亚洲aⅴ在线观看| 国产不卡人人| 国产欧美91| 午夜精品福利影院| 91久久国产| 91亚洲国产高清| 欧美精品国产一区| 伊人精品久久| 亚洲深夜影院| 国产一区视频在线观看免费| 国产欧洲在线| 久久久精品国产**网站| 日产欧产美韩系列久久99| 亚洲精品午夜av福利久久蜜桃| av综合电影网站| 久久香蕉网站| 国产精品香蕉| 日韩激情精品| 视频一区二区三区在线| 久久精品国产大片免费观看| 国产在线观看www| 久久精品亚洲| 国产精品亚洲综合色区韩国| 青青青国产精品| 亚洲精品影视| 青青久久av| www.九色在线| 97精品国产99久久久久久免费| 免费欧美日韩| 欧美在线资源| 日韩精品久久久久久久电影99爱 | 日本午夜精品久久久| 亚洲五月综合| 视频一区中文字幕国产| 久久美女性网| 午夜av不卡| 色88888久久久久久影院| 欧美国产先锋| 久久99高清| 国语精品一区| 亚洲啊v在线| 久久久久91| 99视频精品全部免费在线视频| 免费久久精品视频| 一区二区国产在线观看| 综合激情一区| 日韩精品久久久久久久软件91| 亚洲天堂日韩在线| 日本一区二区三区中文字幕| 亚洲精品影院在线观看| 久久国产小视频| 欧美成人精品| 久久国产精品毛片| 亚洲精品日韩久久| 日本va欧美va瓶| 欧美日韩亚洲一区在线观看| 你懂的国产精品永久在线| 麻豆国产91在线播放| 日韩1区在线| 欧美jjzz| 亚洲一区av| 国产精品一区二区三区av| 精品五月天堂| 久久精品主播| 婷婷激情图片久久| 婷婷成人av| 麻豆精品在线| 午夜精品久久久久久久久久蜜桃| 久久亚洲精品中文字幕蜜潮电影| 欧美日韩国产免费观看视频| 久久亚洲欧美| 国产日韩欧美在线播放不卡| 国产精品99久久精品| 在线日韩电影| 亚洲精品在线国产| 欧美激情福利| 99久精品视频在线观看视频| 视频一区在线视频| 国产乱人伦丫前精品视频| 国内精品美女在线观看| 久久国产电影| 亚久久调教视频| 国产 日韩 欧美 综合 一区| 国产综合色产| 日本在线不卡视频一二三区| 免费在线亚洲欧美| 免费久久精品| 欧美亚洲三级| 久久婷婷久久| 四虎精品永久免费| 福利片在线一区二区| 午夜久久黄色| 国产精品s色| 亚洲高清成人| 日韩精选在线| 日韩影院二区| 日本少妇一区二区| 亚洲91精品| 欧美永久精品| 亚洲福利专区| 国产乱论精品| 日韩一区亚洲二区| 亚洲久草在线| av在线资源| 日韩专区视频网站| 日韩精品不卡一区二区| 午夜精品影视国产一区在线麻豆| 欧美韩日一区| 日韩视频1区| 日韩黄色大片| 99亚洲精品| 国产在线观看www|