Python dictConfig中TimedRotatingFileHandler每日轮转失效问题
日志每日轮转失效问题排查与修复
核心问题分析
多Handler共享同一日志文件
info_time_handler和error_time_handler都配置了相同的filename: '../logs/dinfo.log',两个TimedRotatingFileHandler实例同时操作同一个文件会引发文件句柄冲突:- 应用启动时的日志能写入是因为此时两个handler的文件句柄刚初始化,还未出现竞争;
- 后续日志写入时,两个handler的文件操作互相干扰,导致日志无法正常输出,轮转逻辑也无法触发。
冗余配置项
两个时间轮转handler中重复定义了backupCount:7,虽然Python字典会自动保留最后一个值,但属于无效冗余配置,建议清理。
修复后的配置示例
logging.config.dictConfig({ 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'simple': { 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s' } }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'level': 'DEBUG', 'formatter': 'simple', 'stream': 'ext://sys.stdout' }, 'info_file_handler': { 'class': 'logging.handlers.RotatingFileHandler', 'level': 'INFO', 'formatter': 'simple', 'filename': '../logs/info.log', 'maxBytes': 10485760, 'backupCount': 20, 'encoding': 'utf8' }, 'error_file_handler': { 'class': 'logging.handlers.RotatingFileHandler', 'level': 'ERROR', 'formatter': 'simple', 'filename': '../logs/errors.log', 'maxBytes': 10485760, 'backupCount': 20, 'encoding': 'utf8' }, 'info_time_handler': { 'class': 'logging.handlers.TimedRotatingFileHandler', 'level': 'INFO', 'formatter': 'simple', "when": "d", # 按天轮转 "interval": 1, "backupCount": 7, 'filename': '../logs/daily_info.log', # 使用独立文件名 'encoding': 'utf8' }, 'error_time_handler': { 'class': 'logging.handlers.TimedRotatingFileHandler', 'level': 'ERROR', 'formatter': 'simple', "when": "d", # 按天轮转 "interval": 1, "backupCount": 7, 'filename': '../logs/daily_errors.log', # 使用独立文件名 'encoding': 'utf8' } }, 'root': { 'level': 'INFO', 'handlers': ['console', 'info_time_handler', 'error_time_handler'] } })
额外验证步骤
- 确认
../logs目录存在且应用进程有读写权限,避免因权限问题导致日志写入失败; - 若需快速测试轮转逻辑,可临时修改
when为's'(秒级)、interval:5,验证轮转是否正常触发。
内容的提问来源于stack exchange,提问作者Sultan Zhumatayev
相关产品推荐
相关产品推荐

