python日志轮转主要通过rotatingfilehandler(按大小)和timedrotatingfilehandler(按时间)实现,分别适用于高频写入和按周期归档场景;需注意编码、权限及多进程安全问题,并推荐按天归档+控制台输出的组合配置。

Python日志轮转主要靠 logging.handlers.RotatingFileHandler 或 TimedRotatingFileHandler 实现,核心是自动归档旧日志、控制文件数量和大小,避免磁盘被撑爆。
按大小轮转:RotatingFileHandler
适合日志写入频率高、单次运行时间不固定的场景。当日志文件达到指定大小,就重命名旧文件(如 app.log.1、app.log.2),新建空文件继续写。
-
maxBytes:单个日志文件最大字节数,比如
10 * 1024 * 1024(10MB) - backupCount:最多保留几个历史备份文件,超出的自动删除
- 注意:轮转发生在下一次
logger.info()等写入时触发,不是实时检测
按时间轮转:TimedRotatingFileHandler
适合需要按天/小时归档、便于按时间排查问题的场景。支持 when='D'(每天)、'H'(每小时)、'midnight'(零点)等策略。
-
when 和 interval 共同决定轮转周期,例如
when='D', interval=1表示每天轮转一次 -
backupCount 同样控制保留多少个历史文件,比如保留最近7天的
app.log.2024-05-01 - 默认用
%Y-%m-%d_%H-%M-%S格式命名归档文件,可通过suffix自定义,如suffix='%Y-%m-%d'
避免常见坑:编码、权限与多进程
实际部署中容易出问题的地方:
立即学习“Python免费学习笔记(深入)”;
- Windows 下中文路径或日志内容含中文,需显式指定
encoding='utf-8' - Linux 上若用 systemd 或 supervisord 启动,确保运行用户对日志目录有写权限
- 多个 Python 进程同时写同一日志文件?不要共用同一个 RotatingFileHandler —— 轮转逻辑非原子操作,会导致丢失或错乱;应改用日志服务器(如 syslog)或进程间协调方案
推荐配置模板(带格式+轮转+控制台输出)
一个开箱即用的实用组合:
- 主日志用
TimedRotatingFileHandler按天归档,保留30天 - 同时加一个
StreamHandler输出到终端,方便开发调试 - 统一使用
%(asctime)s %(levelname)-8s %(name)s %(message)s格式,时间精确到毫秒 - 设置
logger.setLevel(logging.INFO),避免 DEBUG 日志刷屏










