背景与问题
在容器化部署环境中,应用日志持续写入容器标准输出或挂载卷,若未及时轮转,会导致磁盘空间耗尽、监控告警触发,甚至影响容器正常运行。IDC运维中常见的场景包括长时间运行的服务日志、错误堆栈频繁输出等。本文提供一套经过验证的日志轮转配置方案,适用于Docker、containerd等主流容器引擎。
配置步骤
1. 确认容器日志驱动
容器日志轮转依赖底层驱动设置。检查当前Docker守护进程配置:
- 查看
/etc/docker/daemon.json 是否已定义 log-driver 和 log-opts。 - 若未定义,默认使用
json-file 驱动,支持按大小和文件数轮转。
2. 设置日志大小与轮转策略
编辑或创建 /etc/docker/daemon.json,添加以下配置:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- max-size:每个日志文件的最大体积,超过后触发轮转(可设为 5m、50m、1g 等)。
- max-file:保留的日志文件数量(含当前正在写入的文件),轮转后删除最旧文件。
3. 重启Docker服务
执行以下命令使配置生效:
sudo systemctl restart docker
注意:重启会导致所有运行中容器退出,请提前规划维护窗口或使用 docker update 对单个容器动态调整日志选项(仅支持部分驱动)。
4. 验证配置
- 检查运行中容器:
docker inspect <容器名> | grep -A10 LogOpt。 - 模拟日志输出:
docker logs --tail=100 <容器名>,观察日志目录 /var/lib/docker/containers/<容器ID> 下是否有轮转后生成的 .log.1 等文件。
5. 针对挂载卷日志的处理
若应用程序将日志写入挂载卷(如 /var/log/app/),需在容器内配置系统日志轮转工具(如 logrotate)。示例步骤:
- 将 logrotate 配置放入镜像:
COPY logrotate.conf /etc/logrotate.d/app。 - 设置 cron 定时任务或使用 supervisor 执行
logrotate -f /etc/logrotate.d/app。 - 配置示例:
/var/log/app/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
注意事项与最佳实践
- 不要盲目压缩:日志压缩可能增加 CPU 开销,建议根据日志产生速度权衡。
- 监控告警:配合 Prometheus 等工具监控容器日志大小,设置阈值告警。
- 避免同容器多进程写入:多个进程写同一日志文件会导致轮转混乱,建议每个容器只输出标准输出/错误。
- 非 Docker 场景:对于 containerd 或 CRI-O,需在 kubelet 配置中设置
containerLogMaxSize 和 containerLogMaxFiles。
通过以上步骤,IDC运维团队可快速落地容器日志轮转策略,避免磁盘爆满导致的业务中断。