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

如何通过TimedRotatingFileHandler实现带动态日期前缀的当前日志文件名

如何通过TimedRotatingFileHandler实现带动态日期前缀的当前日志文件名

我太懂你这个困扰了!之前用静态文件名的方式确实别扭,每次想实时看今天的日志,还得盯着那个约定好的静态文件,不能直接通过当天的日期快速定位。其实咱们可以改造一下TimedRotatingFileHandler的逻辑,让当前正在写入的日志文件直接用当天的日期命名,同时还能保留自动轮转的功能,完美解决你的问题!

具体实现方案

我们可以自定义一个继承自TimedRotatingFileHandler的子类,在初始化和轮转逻辑里做一点小改动,就能实现需求:

import datetime as dt
import logging
from logging.handlers import TimedRotatingFileHandler

class DateNamedTimedRotatingFileHandler(TimedRotatingFileHandler):
    def __init__(self, when='midnight', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None):
        # 初始化时直接生成当天的日期作为日志文件名
        current_filename = dt.datetime.now().strftime("%Y%m%d.log")
        super().__init__(current_filename, when=when, interval=interval, backupCount=backupCount, encoding=encoding, delay=delay, utc=utc, atTime=atTime)
    
    def doRollover(self):
        # 关闭当前的日志文件(即昨天的日期文件)
        self.stream.close()
        # 生成新的当天日期文件名
        new_filename = dt.datetime.now().strftime("%Y%m%d.log")
        # 更新handler的基础文件名
        self.baseFilename = new_filename
        # 打开新的日志文件
        self.stream = self._open()
        # 调用父类的轮转逻辑完成后续清理(比如删除超期的历史日志)
        super().doRollover()

# 测试使用
logger = logging.getLogger("test")
logger.setLevel(logging.INFO)  # 务必设置日志级别,否则可能看不到输出
handler = DateNamedTimedRotatingFileHandler(when="midnight", backupCount=7)  # backupCount保留7天历史日志
logger.addHandler(handler)

# 写一条测试日志
logger.info("这是今天的第一条测试日志")

方案优势

  • 实时日志直接定位:当前正在写入的日志文件就是当天的日期命名(比如20250311.log),你随时可以直接打开这个文件查看实时日志,再也不用记静态文件名的约定
  • 自动轮转无额外操作:午夜自动触发轮转时,会自动关闭昨天的日志文件,创建新的当天日期文件继续写入,全程无需手动干预
  • 灵活定制文件名:如果需要给文件名加后缀/前缀,直接修改strftime的格式字符串即可,比如改成"%Y%m%d_process.log"就能生成带后缀的文件名
  • 历史日志管理:通过backupCount参数可以指定保留的历史日志天数,超出的旧日志会自动删除

对比你原来的方案

原来的方式需要依赖静态文件名+事后重命名,现在的方案从根源上解决了问题:日志文件从创建开始就是日期命名,完全符合你“直接打开今天的日期文件看日志”的需求。

备注:内容来源于stack exchange,提问作者not_real_moderator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:53:00