python日志切割与归档核心依赖rotatingfilehandler(按大小)和timedrotatingfilehandler(按时间),自动完成归档,无需手动处理;前者适用于高频率大日志场景,后者便于按日期排查问题;支持自定义dorollover实现gzip压缩;生产环境需避免多进程共享、敏感信息脱敏、双输出及使用绝对路径。

Python 日志切割与归档,核心靠 logging.handlers.RotatingFileHandler 和 TimedRotatingFileHandler,前者按大小切,后者按时间切;归档逻辑由 handler 自动完成,无需手动压缩或移动文件。
按文件大小自动切割(RotatingFileHandler)
适合日志写入频率高、单次日志量大的场景。达到设定大小后,旧日志重命名(如 app.log.1、app.log.2),最新日志始终写入主文件 app.log。
关键参数说明:
-
maxBytes:单个日志文件最大字节数(例如
10 * 1024 * 1024表示 10MB) - backupCount:保留多少个历史备份文件(超出数量的最老文件会被删除)
-
encoding:建议设为
"utf-8",避免中文乱码
示例代码:
立即学习“Python免费学习笔记(深入)”;
import logging
from logging.handlers import RotatingFileHandler
<p>handler = RotatingFileHandler(
"app.log",
maxBytes=10 <em> 1024 </em> 1024, # 10MB
backupCount=5,
encoding="utf-8"
)
logger = logging.getLogger("myapp")
logger.setLevel(logging.INFO)
logger.addHandler(handler)
logger.info("服务启动成功")</p>按时间周期自动切割(TimedRotatingFileHandler)
适合需要按天/小时归档、便于按日期排查问题的场景。支持秒(S)、分(M)、时(H)、日(D)、周(W0–W6)、月(midnight)等周期。
常用组合:
-
when="D", interval=1:每天零点切一份(默认命名如
app.log.2024-05-20) - when="midnight", backupCount=30:同上,但更明确语义;保留最近30天
-
when="H", interval=1:每小时切一份(文件名含小时,如
app.log.2024-05-20_14)
注意:delay=True 可延迟文件打开,避免启动时无日志目录报错;utc=True 可统一用 UTC 时间避免时区干扰。
自定义归档行为(重写 doRollover)
标准 handler 不压缩归档文件。如需自动 zip 或 gzip,需继承并重写 doRollover() 方法。
简单 gzip 压缩示例(仅压缩 .1 及以上备份):
import gzip
import os
from logging.handlers import TimedRotatingFileHandler
<p>class GzTimedHandler(TimedRotatingFileHandler):
def doRollover(self):
super().doRollover()</p><h1>压缩所有 .1, .2 ... 备份文件</h1><pre class='brush:python;toolbar:false;'> for i in range(1, self.backupCount + 1):
old_file = f"{self.baseFilename}.{i}"
if os.path.exists(old_file):
with open(old_file, "rb") as f_in:
with gzip.open(f"{old_file}.gz", "wb") as f_out:
f_out.writelines(f_in)
os.remove(old_file)使用方式与原 handler 一致,只需替换 handler 实例即可。
生产环境实用建议
- 避免在多进程下直接共用同一日志文件——用
ConcurrentLogHandler(需 pip install)或改用日志中心(如 ELK、Loki) - 敏感信息(密码、token)务必在写入日志前脱敏,handler 不负责内容过滤
- 线上建议同时启用控制台和文件双输出,方便调试;用
StreamHandler配合RotatingFileHandler - 日志路径建议用绝对路径,或基于
os.path.dirname(__file__)构建,防止工作目录变化导致写入失败










