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

Flask项目中TimedRotatingFileHandler生成异常日志文件的解决咨询

解决Flask中Python logging日志文件命名异常问题

当前生成的日志文件出现异常命名,示例如下:

2023-04-05.log
2023-04-06.log
2023-04-07.log.2023-05-13
2023-04-07.log.2023-05-14
2023-04-07.log.2023-05-15
2023-04-07.log.2023-05-16
2023-04-07.log.2023-05-17
2023-04-08.log
2023-04-09.log
2023-04-10.log
2023-04-11.log
2023-04-11.log.2023-04-11
2023-04-12.log
2023-04-12.log.2023-04-12

问题原因

你的代码中手动给日志文件名添加了当前日期(info-' + time.strftime('%Y-%m-%d',...) + '.log'),但TimedRotatingFileHandler本身具备自动轮转和命名备份文件的能力。这种手动命名的方式会和Handler的自动逻辑冲突:

  • 每次应用启动时,都会生成一个带当天日期的新基础日志文件
  • 当Handler执行轮转(比如午夜)时,会尝试对当前基础文件进行重命名,但如果后续启动的基础文件名变化,Handler会误将旧的带日期的文件当作需要轮转的目标,从而在其后面追加新的日期后缀,导致命名异常。

正确配置方案

移除手动添加的日期后缀,让TimedRotatingFileHandler管理基础文件名,并通过suffix参数指定备份文件的日期格式,配置代码如下:

# 基础日志文件名不带日期,仅保留固定前缀
info_handler = TimedRotatingFileHandler(
    filename='logs/info/info.log',
    when="midnight",
    backupCount=7,
    encoding='utf-8',
    suffix='%Y-%m-%d.log'  # 指定备份文件的日期后缀格式
)
info_handler.setFormatter(formatter)
info_handler.setLevel(logging.DEBUG)

配置说明

  • filename:设置为固定的基础文件名(如info.log),不要包含动态日期
  • when="midnight":指定每天午夜执行日志轮转
  • backupCount=7:保留最近7天的备份日志
  • suffix='%Y-%m-%d.log':轮转后的备份文件会命名为info.log.2023-04-07,如果希望备份文件名格式为info-2023-04-07.log,可以配合extMatch参数使用正则匹配,示例如下:
import re

info_handler = TimedRotatingFileHandler(
    filename='logs/info/info.log',
    when="midnight",
    backupCount=7,
    encoding='utf-8',
    suffix='-%Y-%m-%d.log',
    extMatch=re.compile(r'-\d{4}-\d{2}-\d{2}\.log')
)

这种配置下,轮转后的文件会变成info-2023-04-07.log,当前正在写入的文件始终是info.log。

注意事项

  1. 确保logs/info目录存在,若不存在可通过os.makedirs('logs/info', exist_ok=True)提前创建
  2. 清理之前生成的异常命名日志文件,避免干扰新的轮转逻辑
  3. 配置修改后需要重启Flask应用生效

内容的提问来源于stack exchange,提问作者Hiền An Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:31:20