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

您的位置:首頁技術文章
文章詳情頁

python 實現logging動態變更輸出日志文件名

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

python作為一門非常容易上手的腳本語言,日志輸出更是簡單,logging模塊,簡單的設置配置和屬性,就能實現到控制臺輸出日志,在basicConfig()設置文件名,就能夠將日志信息寫入文件,簡直是簡單到不能再簡單。

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

代碼編寫環境:python3.4.3

1.logging.basicConfig()

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

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’)

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

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對象,實現對控制臺(logging.StreamHandler)、文件(logging.FileHandler)等不同目標輸出日志。

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

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

# 默認配置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’)

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

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

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

延伸之前Handler的思路,我們可以實現對handler的動態管理,變更日志文件。每次需要變更輸出文件路徑前,使用handler管理清空原先的logging.FileHandler對象,重新創建一個新文件名的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循環執行3次處理,分別創建日志文件名稱為mylog1.txt, mylog2.tx, mylog3.txt,并寫入相同的內容。執行結果確實產生不同名稱的文件,日志內容也正確寫入。

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

簡單實現方案

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

import logging, logging.handlersimport time’’’TimedRotatingFileHandler構造函數聲明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 保留日志最大文件數,超過限制,刪除最先創建的文件;默認值0,表示不限制。delay 延遲文件創建,直到第一次調用emit()方法創建日志文件atTime 在指定的時間(datetime.time格式)創建日志文件。’’’def test_TimedRotatingFileHandler(): # 定義日志輸出格式 fmt_str = ’%(asctime)s[level-%(levelname)s][%(name)s]:%(message)s’ # 初始化 logging.basicConfig() # 創建TimedRotatingFileHandler處理對象 # 間隔5(S)創建新的名稱為myLog%Y%m%d_%H%M%S.log的文件,并一直占用myLog文件。 fileshandle = logging.handlers.TimedRotatingFileHandler(’myLog’, when=’S’, interval=5, backupCount=3) # 設置日志文件后綴,以當前時間作為日志文件后綴名。 fileshandle.suffix = '%Y%m%d_%H%M%S.log' # 設置日志輸出級別和格式 fileshandle.setLevel(logging.DEBUG) formatter = logging.Formatter(fmt_str) fileshandle.setFormatter(formatter) # 添加到日志處理對象集合 logging.getLogger(’’).addHandler(fileshandle)if __name__ == ’__main__’: test_TimedRotatingFileHandler() # 測試在200s內創建文件多個日志文件 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配置文件實現。文件 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,當使用無參函數logging.getLogger()時,默認返回root這個logger,其他自定義logger可以通過 logging.getLogger('fileLogger') 方式進行調用

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

formatter : 設置日志格式

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

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

formatter_xxx : 對聲明的formatterjinx進行配置

代碼示例

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

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

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

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

標簽: Python 編程
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
丁香婷婷久久| 日韩欧美三级| 免费视频亚洲| 久久亚洲二区| 亚洲高清不卡| 久久先锋影音| 国产美女亚洲精品7777| 久久av中文| 日韩精品欧美| 性欧美长视频| 日本精品国产| 日韩av片子| 伊人久久亚洲热| 亚洲精品裸体| 免播放器亚洲一区| 国产精品久久久免费| 91精品韩国| 日韩av在线免费观看不卡| 欧美极品一区二区三区| 亚洲91视频| 欧美日韩亚洲一区二区三区在线| 精品网站aaa| 夜夜精品视频| 精品一区二区三区中文字幕视频 | 国产精品成人**免费视频| 国产精品成久久久久| 三级亚洲高清视频| 国内一区二区三区| 日韩一级欧洲| 福利一区二区三区视频在线观看| 99国产精品久久久久久久| 国产精品极品国产中出| 久久国产高清| 蜜桃av.网站在线观看| 中文字幕一区二区三区四区久久| 精品中文字幕一区二区三区 | 精品高清久久| 久久国产88| 国产成人在线中文字幕| 亚洲精品少妇| 欧美搞黄网站| 美女久久久久久| 日韩av一区二区三区四区| 免费视频一区三区| 亚洲一级少妇| 成人在线视频区| 国产精品黄色| 奇米色欧美一区二区三区| 好吊日精品视频 | 日韩大片在线播放| 久久影院一区二区三区| 最新亚洲国产| 亚洲字幕久久| 亚洲综合福利| 日韩精品三级| 五月国产精品| 中文字幕av一区二区三区四区| av一区在线| 亚洲深夜视频| 久久国产日韩| 欧美aa国产视频| 国产亚洲综合精品| 久久www成人_看片免费不卡| 亚洲大全视频| 麻豆亚洲精品| 久久激情av| 国产伦精品一区二区三区千人斩 | 伊人国产精品| 欧美日本久久| 国产乱码精品一区二区亚洲| 国产欧美日韩精品一区二区免费| 91亚洲精品视频在线观看| 亚洲狼人精品一区二区三区| 日韩精品久久久久久| 国产精品一区二区av日韩在线| 久久久91麻豆精品国产一区| 福利在线免费视频| 五月精品视频| 日本91福利区| 欧美激情日韩| 日韩精品导航| 亚洲va中文在线播放免费| 99精品综合| 综合激情婷婷| 日本а中文在线天堂| 久久亚洲美女| 你懂的国产精品| 羞羞答答国产精品www一本| 国产美女久久| 最新日韩欧美| 国产精品第一国产精品| 国产专区一区| 国产欧美自拍| 婷婷成人基地| 久久精品av麻豆的观看方式| 香蕉成人av| 国产精品一级在线观看| 91精品99| 亚洲免费福利| 国产精品主播| 日韩亚洲在线| 日韩国产一区| 国产日韩免费| 免费看日韩精品| 欧美香蕉视频| 国产日韩一区二区三免费高清| 伊人影院久久| 国产一区二区三区自拍| 岛国av在线播放| 日韩av资源网| 亚洲欧洲专区| 美日韩精品视频| 亚洲无线一线二线三线区别av| 国产精品久一| 国产欧美激情| 久久国产精品色av免费看| 亚洲理论在线| 亚洲尤物av| 玖玖精品视频| 亚洲免费福利一区| jiujiure精品视频播放| 啪啪国产精品| 伊人久久国产| av在线资源| 久久的色偷偷| 免费一级欧美在线观看视频| 国产探花在线精品| 日韩av网站在线免费观看| 亚洲免费福利一区| 国产伦精品一区二区三区在线播放| 久久精品 人人爱| 国产精品2023| 精品一区二区三区中文字幕视频 | www在线观看黄色| 国产一区二区三区91| 国内自拍视频一区二区三区| 久久精品国产久精国产| 国产96在线亚洲| 国产理论在线| 极品裸体白嫩激情啪啪国产精品| 欧美日韩国产一区精品一区| 91久久国产| 视频一区日韩精品| 国产高清日韩| 久久久久久自在自线| 免费视频亚洲| 亚洲精品成a人ⅴ香蕉片| 日韩中文欧美在线| 国产精品一级| 欧美成a人国产精品高清乱码在线观看片在线观看久| 精品72久久久久中文字幕| 秋霞影院一区二区三区| 久久国产精品毛片| 国产精品啊啊啊| 欧美 日韩 国产一区二区在线视频| 99视频精品| 国精品产品一区| 亚洲久草在线| 欧美日韩视频免费观看| 日韩精彩视频在线观看| 精品国产乱码久久久久久樱花 | 国产精品久久国产愉拍| 欧美日韩在线网站| 欧美偷窥清纯综合图区| 欧美精选一区二区三区| 久久精品 人人爱| 亚洲一区欧美激情| 色婷婷色综合| 日韩在线麻豆| 国内精品福利| 精品国产精品国产偷麻豆| 在线日韩成人| 五月天久久777| 色在线中文字幕| 国产精选久久| 亚洲欧美不卡| 好吊日精品视频| 欧美亚洲国产一区| 中文字幕高清在线播放| 国产精品久久久久久久久久白浆| 中国女人久久久| 精品在线91| 在线日韩中文| 久久精选视频| 97se综合| 毛片在线网站| 日本久久成人网| 在线看片国产福利你懂的| 久久av免费| 国产精品99视频| 你懂的亚洲视频| 欧美1区二区| 国产一区一一区高清不卡| 老司机免费视频一区二区三区| 国产精品一区三区在线观看| 蜜臀av在线播放一区二区三区| 免费精品视频| 日韩欧美激情| 国产精品一区二区av日韩在线| 美腿丝袜亚洲一区|