日志轮转配置

日志轮转配置

为什么需要日志轮转

容器日志如果不加管理,会不断增长最终占满磁盘。日志轮转(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
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容