电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

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

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

代碼編寫環(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()設置屬性具有全局性,第一次設置之后,之后再設置將不再生效。查看官方文檔,也確實是如此。

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()設置,并添加輸出指向控制臺的流處理(StreamHandler)對象console,實現(xiàn)同時輸出日志。當然也可以反過來,默認設置控制臺輸出日志,之后創(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) # 設置日志文件后綴,以當前時間作為日志文件后綴名。 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內(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(將日志輸出保存到文件中,并設置單個日志wenj文件的大小和日志文件個數(shù))

formatter : 設置日志格式

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

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

formatter_xxx : 對聲明的formatterjinx進行配置

代碼示例

logging.config.fileConfig(“l(fā)ogging.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進行日志輸出了。

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

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

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 劳动法网-专业的劳动法和劳动争议仲裁服务网 | 山东氧化铁红,山东铁红-淄博科瑞化工有限公司 | 洛阳装修公司-洛阳整装一站式品牌-福尚云宅装饰| 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 游动电流仪-流通式浊度分析仪-杰普仪器(上海)有限公司 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 彭世修脚_修脚加盟_彭世修脚加盟_彭世足疗加盟_足疗加盟连锁_彭世修脚技术培训_彭世足疗 | 防火窗_耐火窗_防火门厂家_防火卷帘门-重庆三乐门业有限公司 | 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 嘉兴恒升声级计-湖南衡仪声级计-杭州爱华多功能声级计-上海邦沃仪器设备有限公司 | 西门子气候补偿器,锅炉气候补偿器-陕西沃信机电工程有限公司 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | 酒水灌装机-白酒灌装机-酒精果酒酱油醋灌装设备_青州惠联灌装机械 | 动环监控_机房环境监控_DCIM_机房漏水检测-斯特纽 | 包塑丝_高铁绑丝_地暖绑丝_涂塑丝_塑料皮铁丝_河北创筹金属丝网制品有限公司 | 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 塑料托盘厂家直销-吹塑托盘生产厂家-力库塑业【官网】 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 石英砂矿石色选机_履带辣椒色选机_X光异物检测机-合肥幼狮光电科技 | 特材真空腔体_哈氏合金/镍基合金/纯镍腔体-无锡国德机械制造有限公司 | 云南外加剂,云南速凝剂,云南外加剂代加工-普洱澜湄新材料科技有限公司 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 微信聊天记录恢复_手机短信删除怎么恢复_通讯录恢复软件下载-快易数据恢复 | 胶泥瓷砖胶,轻质粉刷石膏,嵌缝石膏厂家,腻子粉批发,永康家德兴,永康市家德兴建材厂 | 热缩管切管机-超声波切带机-织带切带机-无纺布切布机-深圳市宸兴业科技有限公司 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 耐火浇注料价格-高强高铝-刚玉碳化硅耐磨浇注料厂家【直销】 | 企典软件一站式企业管理平台,可私有、本地化部署!在线CRM客户关系管理系统|移动办公OA管理系统|HR人事管理系统|人力 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 双舌接地线-PC68数字式高阻计-ZC36|苏海百科 | 逗网红-抖音网红-快手网红-各大平台网红物品导航 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | 蓝米云-专注于高性价比香港/美国VPS云服务器及海外公益型免费虚拟主机 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 |