Python日志轮转需显式配置RotatingFileHandler(按大小)或TimedRotatingFileHandler(按时间),注意多进程、重启残留、外部logrotate冲突及平台兼容性,推荐按天轮转+压缩+分级日志+清理钩子。

Python日志轮转(Log Rotation)是保障长期运行服务日志可控、不占满磁盘的关键机制。默认的 FileHandler 不会自动切分或清理旧日志,必须显式配置轮转策略,否则可能因日志无限制增长导致服务异常或系统告警。
使用 RotatingFileHandler 控制单文件大小
适用于按体积轮转的场景,比如单个日志文件不超过 10MB,最多保留 5 个历史文件:
- 导入
logging.handlers.RotatingFileHandler - 设置
maxBytes=10*1024*1024(即 10MB) - 设置
backupCount=5,超出时自动删除最老的 .1、.2… 文件 - 注意:轮转只在写入时触发,不会主动扫描清理;文件名后缀为
.1、.2等,原日志始终是无后缀的主文件
使用 TimedRotatingFileHandler 按时间切分
适合需按天/小时归档的运维习惯,例如每天生成一个新日志文件:
- 指定
when='midnight'(每日零点)、'D'(同义)、'H'(每小时)、'W0'(每周一)等 - 用
interval=1配合when,避免误设成每秒轮转 -
backupCount=30表示最多保留最近 30 个周期的日志(如 30 天) - 生成的文件名含时间戳,如
app.log.2024-05-20,依赖系统时区;建议统一设为 UTC 或显式指定utc=True
避免常见陷阱
长期运行中容易忽略但影响严重的细节:
立即学习“Python免费学习笔记(深入)”;
- 多进程共用同一日志文件时,
RotatingFileHandler无法保证原子性,可能导致日志错乱或丢失 —— 应改用QueueHandler + QueueListener或集中式日志方案 - 程序重启后,若未重新初始化 logger,旧 handler 可能残留,造成重复写入或轮转失效
- Linux 下被
logrotate外部轮转后,Python 进程仍持有原文件句柄,新日志会继续写入已被重命名的旧文件 —— 需配合logging.handlers.BaseRotatingHandler.doRollover()或监听信号重开文件 - Windows 上对正在写的日志文件重命名可能失败,
TimedRotatingFileHandler默认使用os.rename,建议测试兼容性或改用delay=True缓解
生产环境推荐组合
兼顾可读性、排查效率与磁盘安全:
- 按天轮转 + 压缩归档:用
TimedRotatingFileHandler配合自定义doRollover方法,在切分后调用gzip压缩旧文件 - 主日志 + 错误专项日志:INFO 级别写入 daily 日志,ERROR 单独进
error.log并启用大小轮转,便于快速定位异常 - 添加日志清理钩子:在应用退出前调用
handler.close(),避免最后几条日志未刷盘 - 定期校验:脚本检查
log/目录下文件总数和总大小,超限时触发告警而非静默丢弃
日志轮转不是“配完就完”的一次性动作,而是需要结合部署方式、运行周期和运维习惯持续验证的环节。一次合理配置,能省去后期大量磁盘排查和人工清理工作。










