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 的日志驱动可能被显式配置为 syslog 或 journald。
步骤:
-
检查 Docker 全局配置文件
查看/etc/docker/daemon.json是否配置了日志驱动:cat /etc/docker/daemon.json- 如果文件中包含
"log-driver": "syslog"或"log-driver": "journald",则日志会被转发到系统日志服务。 - 如果未配置,Docker 会使用默认的
json-file驱动。
- 如果文件中包含
-
检查容器启动参数
如果容器启动时使用了--log-driver参数(如--log-driver=syslog),也会导致日志被转发到系统日志服务:docker inspect <container_id> | grep -i log
2. 修改 Docker 日志驱动(推荐方案)
如果希望 Docker 日志不写入 /var/log/messages,可以将日志驱动改回 json-file 或配置日志轮转。
方案 1:全局修改 Docker 日志驱动
-
编辑 Docker 配置文件:
sudo vi /etc/docker/daemon.json -
添加或修改日志驱动配置:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }max-size和max-file用于限制日志大小和文件数量,防止磁盘爆满。
-
重启 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 日志
-
检查
rsyslog配置文件(如/etc/rsyslog.conf或/etc/rsyslog.d/*.conf):grep -i docker /etc/rsyslog* -
如果存在类似规则:
local7.* /var/log/messageslocal7是 Docker 默认使用的日志设施(facility)。此规则会导致 Docker 日志被写入/var/log/messages。
-
修改规则,将 Docker 日志输出到单独文件:
local7.* /var/log/docker.log -
重启
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. 验证修改后的效果
-
检查 Docker 日志路径
确认日志是否写入容器的 JSON 文件:ls /var/lib/docker/containers/<container-id>/*.log -
检查系统日志文件
确保/var/log/messages中不再出现 Docker 日志:tail -n 100 /var/log/messages | grep -i docker -
使用
journalctl查看日志
如果使用journald,可以通过以下命令查看 Docker 日志:sudo journalctl CONTAINER_NAME=<container_name>
5. 补充建议
- 日志集中化管理
如果需要统一管理日志,可以将 Docker 日志驱动配置为syslog或fluentd,并结合 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."
总结
通过以上步骤,您可以:
- 将 Docker 日志驱动改为
json-file,避免日志写入系统日志文件。 - 调整
rsyslog或journald配置,隔离 Docker 日志与系统日志。 - 根据需求选择日志集中化管理方案,提升可维护性。
直接说答案
- 注释掉以下内容
#### 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