docker打印日志到系统messages中导致磁盘爆满

作者:Administrator 发布时间: 2025-07-31 阅读量:5 评论数:0

docker打印日志到系统messages中导致磁盘爆满

要解决 Docker 日志被打印到 /var/log/messages 的问题,需要从 Docker 的日志驱动配置rsyslog 的规则配置 两方面入手。以下是详细的操作步骤:


1. 确认 Docker 的日志驱动配置

Docker 默认使用 json-file 日志驱动,将日志存储在容器的 JSON 文件中(路径为 /var/lib/docker/containers/<container-id>/<container-id>-json.log)。如果日志被写入 /var/log/messages,说明 Docker 的日志驱动可能被显式配置为 syslogjournald

步骤:

  1. 检查 Docker 全局配置文件
    查看 /etc/docker/daemon.json 是否配置了日志驱动:

    cat /etc/docker/daemon.json
    
    • 如果文件中包含 "log-driver": "syslog""log-driver": "journald",则日志会被转发到系统日志服务。
    • 如果未配置,Docker 会使用默认的 json-file 驱动。
  2. 检查容器启动参数
    如果容器启动时使用了 --log-driver 参数(如 --log-driver=syslog),也会导致日志被转发到系统日志服务:

    docker inspect <container_id> | grep -i log
    

2. 修改 Docker 日志驱动(推荐方案)

如果希望 Docker 日志不写入 /var/log/messages,可以将日志驱动改回 json-file 或配置日志轮转。

方案 1:全局修改 Docker 日志驱动

  1. 编辑 Docker 配置文件:

    sudo vi /etc/docker/daemon.json
    
  2. 添加或修改日志驱动配置:

    {
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "10m",
        "max-file": "3"
      }
    }
    
    • max-sizemax-file 用于限制日志大小和文件数量,防止磁盘爆满。
  3. 重启 Docker 服务:

    sudo systemctl restart docker
    

方案 2:单个容器修改日志驱动

如果仅需对特定容器修改日志驱动,可以在启动容器时指定:

docker run --log-driver=json-file --log-opt max-size=10m --log-opt max-file=3 <image>

3. 检查 rsyslog 的配置

如果 Docker 的日志驱动仍为 json-file,但日志仍然出现在 /var/log/messages,可能是 rsyslog 的配置问题。

情况 1:rsyslog 配置转发 Docker 日志

  1. 检查 rsyslog 配置文件(如 /etc/rsyslog.conf/etc/rsyslog.d/*.conf):

    grep -i docker /etc/rsyslog*
    
  2. 如果存在类似规则:

    local7.*    /var/log/messages
    
    • local7 是 Docker 默认使用的日志设施(facility)。此规则会导致 Docker 日志被写入 /var/log/messages
  3. 修改规则,将 Docker 日志输出到单独文件:

    local7.*    /var/log/docker.log
    
  4. 重启 rsyslog 服务:

    sudo systemctl restart rsyslog
    

情况 2:journald 配置转发到 syslog

如果使用 journald 作为日志收集服务,检查 /etc/systemd/journald.conf

grep -i forward /etc/systemd/journald.conf
  • 如果 ForwardToSyslog=yes 被启用,journald 会将日志转发到 rsyslog,进而可能写入 /var/log/messages
  • 如果需要禁用此功能,修改配置:
    ForwardToSyslog=no
    
  • 重启 systemd-journald 服务:
    sudo systemctl restart systemd-journald
    

4. 验证修改后的效果

  1. 检查 Docker 日志路径
    确认日志是否写入容器的 JSON 文件:

    ls /var/lib/docker/containers/<container-id>/*.log
    
  2. 检查系统日志文件
    确保 /var/log/messages 中不再出现 Docker 日志:

    tail -n 100 /var/log/messages | grep -i docker
    
  3. 使用 journalctl 查看日志
    如果使用 journald,可以通过以下命令查看 Docker 日志:

    sudo journalctl CONTAINER_NAME=<container_name>
    

5. 补充建议

  • 日志集中化管理
    如果需要统一管理日志,可以将 Docker 日志驱动配置为 syslogfluentd,并结合 ELK(Elasticsearch + Logstash + Kibana)或 EFK(Elasticsearch + Fluentd + Kibana)方案实现集中化日志分析。
  • 日志清理脚本
    对于 json-file 驱动,定期清理旧日志以避免磁盘占满:
    #!/bin/bash
    find /var/lib/docker/containers/ -name "*-json.log" -exec truncate -s 0 {} \;
    echo "Docker logs truncated."
    

总结

通过以上步骤,您可以:

  1. 将 Docker 日志驱动改为 json-file,避免日志写入系统日志文件。
  2. 调整 rsyslogjournald 配置,隔离 Docker 日志与系统日志。
  3. 根据需求选择日志集中化管理方案,提升可维护性。

直接说答案

  1. 注释掉以下内容
#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!

#20250731添加注释 
#*.info;mail.none;authpriv.none;cron.none                /var/log/messages

2.重启服务

systemctl restart rsyslog

评论