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。
注意事项
- 确保
logs/info目录存在,若不存在可通过os.makedirs('logs/info', exist_ok=True)提前创建 - 清理之前生成的异常命名日志文件,避免干扰新的轮转逻辑
- 配置修改后需要重启Flask应用生效
内容的提问来源于stack exchange,提问作者Hiền An Nguyễn
相关产品推荐
相关产品推荐

