Docker指定json-file日志驱动仍写入syslog如何禁用?
解决Docker容器同时写入json-file和/var/log/syslog的问题
我碰到过类似旧版本Docker + Ubuntu组合的问题,结合你的情况(Docker 1.10.3、Ubuntu 15.04,已配置容器json-file日志驱动但仍写入syslog),主要是两个核心原因导致的,下面是针对性的解决方案:
原因1:Systemd捕获容器输出并转发到syslog
因为你用systemd unit文件启动容器,默认情况下systemd会收集容器的stdout/stderr到journald,而journald又会将日志转发到syslog。要阻止这个行为,需要修改你的容器unit文件:
- 打开你的容器systemd unit文件(比如
/etc/systemd/system/your-container.service) - 在
[Service]段落中添加以下配置,直接丢弃容器的标准输出/错误:
如果你想保留日志到journal但不转发到syslog,可以替换为:StandardOutput=null StandardError=nullLogLevelMax=off - 重新加载systemd配置并重启容器服务:
sudo systemctl daemon-reload sudo systemctl restart your-container.service
原因2:Docker Daemon默认转发容器日志到syslog
在Docker 1.10.x这个旧版本中,即使你为单个容器指定了json-file日志驱动,Docker daemon可能仍会默认将所有容器日志转发到syslog。要禁用这个全局行为:
- 编辑Docker的默认配置文件
/etc/default/docker - 在
DOCKER_OPTS中添加--log-driver=json-file,确保daemon使用json-file作为默认日志驱动,且不转发到syslog:DOCKER_OPTS="--log-driver=json-file" - 重启Docker服务使配置生效:
注意:这个修改会影响所有新启动的容器,已运行的容器需要重启才能应用新的daemon日志策略。sudo service docker restart
额外排查步骤
如果以上方案无效,可以先确认日志的来源:
- 执行
grep "你的容器名称/ID" /var/log/syslog,查看日志的前缀(比如是docker还是systemd),以此判断是Docker daemon还是systemd在转发日志。
内容的提问来源于stack exchange,提问作者Michael Niemand
相关产品推荐
相关产品推荐

