如何通过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
相关产品推荐
相关产品推荐

