日志轮转配置
为什么需要日志轮转
容器日志如果不加管理,会不断增长最终占满磁盘。日志轮转(Log Rotation)通过限制单个日志文件的大小和数量来防止磁盘空间被日志耗尽。
json-file 驱动的日志轮转
配置方式
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
# 重启生效
systemctl daemon-reload
systemctl restart docker
参数说明
| 参数 | 默认值 | 说明 |
|---|---|---|
| max-size | -1(无限制) | 单个日志文件最大大小 |
| max-file | 1 | 保留的日志文件数量 |
| compress | false | 是否压缩旧日志文件 |
| labels | — | 包含的标签 |
| env | — | 包含的环境变量 |
轮转行为
# 原始日志文件
container-json.log → 满了 → 轮转
# 轮转后的文件
container-json.log # 当前日志
container-json.log.1 # 上一个日志
container-json.log.2 # 再上一个
container-json.log.3 # 最旧的(会被删除)
local 驱动的日志轮转
{
"log-driver": "local",
"log-opts": {
"max-size": "10m",
"max-file": "5",
"compress": "true"
}
}
local 驱动性能更好,使用 protobuf 格式存储,自动支持压缩。
容器级别的日志配置
docker run
docker run \
--log-opt max-size=5m \
--log-opt max-file=3 \
nginx
docker-compose
services:
app:
image: myapp
logging:
driver: "json-file"
options:
max-size: "5m"
max-file: "3"
compress: "true"
db:
image: postgres
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "5"
不同服务的不同配置
services:
# 访问日志量大
nginx:
logging:
options:
max-size: "50m"
max-file: "2"
# 错误日志较少
app:
logging:
options:
max-size: "10m"
max-file: "5"
# 调试环境
debug:
logging:
options:
max-size: "100m"
max-file: "10"
查看日志文件
# json-file 驱动日志位置
ls -lh /var/lib/docker/containers/*/*-json.log*
# 查看轮转文件
ls -la /var/lib/docker/containers/abc123/
# abc123-json.log
# abc123-json.log.1
# abc123-json.log.2
# abc123-json.log.3.gz # 如果启用压缩
# 查看日志大小
du -sh /var/lib/docker/containers/*/
日志文件手动清理
方法一:清空日志文件
# 安全清空(不会影响容器)
truncate -s 0 /var/lib/docker/containers/abc123/abc123-json.log
方法二:使用 logrotate 系统工具
# /etc/logrotate.d/docker
/var/lib/docker/containers/*/*.log {
rotate 7
daily
compress
missingok
delaycompress
copytruncate
maxsize 10M
}
方法三:定期脚本
#!/bin/bash
# /usr/local/bin/docker-log-cleanup.sh
# 找到超过 100MB 的日志
find /var/lib/docker/containers/ -name "*-json.log" -size +100M | while read log; do
echo "Truncating: $log"
truncate -s 0 "$log"
done
# cron 定时任务
0 * * * * /usr/local/bin/docker-log-cleanup.sh
配置建议
开发环境
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
生产环境
{
"log-driver": "json-file",
"log-opts": {
"max-size": "20m",
"max-file": "5",
"compress": "true"
}
}
日志量大的服务
// 如反向代理、API 网关
{
"log-opts": {
"max-size": "100m",
"max-file": "2"
}
}
不设置日志轮转的风险
# ❌ 没有限制
docker run nginx
# 日志不断增长
# 最终:
# - 磁盘占满
# - 服务不可用
# - 紧急清理影响正常服务
使用外部日志系统
services:
app:
image: myapp
logging:
driver: "fluentd"
options:
fluentd-address: "localhost:24224"
# fluentd 端的日志轮转配置
# 本地日志限制可以更宽松
max-size: "100m"
max-file: "2"
# 或使用 syslog
nginx:
logging:
driver: "syslog"
options:
syslog-address: "tcp://syslog.example.com:514"
注意事项
# 1. 更改日志配置后,原来日志不会消失
# 2. 重新创建容器才会应用新的日志配置
# 3. 如果日志已很大,先清理再应用新配置
# 4. max-size 和 max-file 参数只对 json-file 和 local 驱动有效
监控日志使用
# 查看每个容器的日志占用
for container in $(docker ps -q); do
name=$(docker inspect $container --format '{{.Name}}')
logfile="/var/lib/docker/containers/$container/${container}-json.log"
if [ -f "$logfile" ]; then
size=$(du -h "$logfile" | cut -f1)
echo "$name: $size"
fi
done
配置日志轮转是 Docker 运维的基础要求,能有效防止日志引发的磁盘问题。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


暂无评论内容