修改TimedRotatingFileHandler的文件命名规则问题求助
Python TimedRotatingFileHandler日志配置优化
针对你的两个日志配置问题,给出以下解决方案:
问题1:替代doRollover()的初始化方式,避免无后缀初始日志文件
当前用doRollover()强制生成带日期后缀的文件是可行的,但可以优化为仅在必要时执行,减少冗余操作。脚本启动时先检查当天的日志文件是否存在,不存在再触发滚动,既保证初始文件带后缀,又避免不必要的文件操作:
import logging import logging.handlers as handlers import os from datetime import datetime chatlogger = logging.getLogger("chatlog") chatlogger.setLevel(logging.INFO) chatlogger.propagate = False # 防止日志重复输出 logHandler = handlers.TimedRotatingFileHandler( 'chatlog_', when='midnight', interval=1, encoding='utf-8' ) logHandler.setLevel(logging.INFO) logHandler.suffix = "%Y%m%d.log" # 检查当天日志文件是否存在,不存在则触发滚动 current_date = datetime.now().strftime("%Y%m%d") expected_log_file = f"chatlog_{current_date}.log" if not os.path.exists(expected_log_file): logHandler.doRollover() chatlogger.addHandler(logHandler)
如果想彻底避免生成无后缀的chatlog_文件,可以在初始化前先处理残留的无后缀文件:
# 初始化前检查并重命名残留的无后缀文件 if os.path.exists('chatlog_'): os.rename('chatlog_', expected_log_file)
问题2:取消suffix与文件名之间的自动点号
TimedRotatingFileHandler默认会在baseFilename和suffix之间添加点号,通过自定义namer函数可以去掉这个点:
# 自定义namer函数,移除文件名与后缀间的点号 def custom_namer(filename): # 默认文件名格式为 "chatlog_.YYYYMMDD.log",替换第一个点为空 return filename.replace('.', '', 1) logHandler.namer = custom_namer # 更新extMatch,确保清理旧日志时能正确匹配文件名 import re logHandler.extMatch = re.compile(r'^\d{8}\.log$')
完整整合代码
import logging import logging.handlers as handlers import os import re from datetime import datetime chatlogger = logging.getLogger("chatlog") chatlogger.setLevel(logging.INFO) chatlogger.propagate = False # 处理残留的无后缀日志文件 current_date = datetime.now().strftime("%Y%m%d") expected_log_file = f"chatlog_{current_date}.log" if os.path.exists('chatlog_'): os.rename('chatlog_', expected_log_file) # 创建TimedRotatingFileHandler logHandler = handlers.TimedRotatingFileHandler( 'chatlog_', when='midnight', interval=1, encoding='utf-8' ) logHandler.setLevel(logging.INFO) logHandler.suffix = "%Y%m%d.log" # 自定义namer去掉点号 def custom_namer(filename): return filename.replace('.', '', 1) logHandler.namer = custom_namer logHandler.extMatch = re.compile(r'^\d{8}\.log$') # 仅当天日志文件不存在时触发滚动 if not os.path.exists(expected_log_file): logHandler.doRollover() chatlogger.addHandler(logHandler)
配置后效果:
- 脚本启动时自动处理残留无后缀文件,首次启动直接生成带日期后缀的日志文件
- 滚动后的日志文件名格式为
chatlog_YYYYMMDD.log,无多余点号 - 午夜自动滚动生成第二天的日志文件,无需手动干预
内容的提问来源于stack exchange,提问作者SkrillKill
相关产品推荐
相关产品推荐

