You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:20:42