修改/etc/docker/daemon.json全局日志驱动为GELF后未生效的问题排查
嘿,看你之前的日志配置都挺顺畅的——全局用journald驱动完全正常,单独给容器配GELF也能成功发日志,结果改成全局GELF之后反而掉坑里了对吧?我来帮你捋捋可能的问题,一步步排查:
先回顾下你的正常配置背景
你原来的/etc/docker/daemon.json是这样的,用journald驱动跑起来毫无问题:
{ "log-driver": "journald", "log-opts": { "tag": "{{.Name}}" }, "userland-proxy": false }
而且单独给容器配置GELF也试过,比如这个Caddy的yaml配置,日志能正常发到GELF接收端:
logging: driver: "gelf" options: gelf-address: "udp://192.168.10.2:12201" tag: "caddy"
全局GELF配置失效的常见坑及排查步骤
你替换后的daemon.json开头内容看起来没写完,但先从最容易踩的坑开始查:
1. 先检查JSON语法!别小看逗号问题
JSON对格式要求特别严格,多一个逗号、少个引号都会让整个配置文件失效,Docker daemon会直接忽略它,继续用默认驱动。比如你贴的这段:
{ "log-driver": "gelf", "log-opts": { "gelf-address": "udp://192.168.10.2:12201", ... }
看到gelf-address后面那个多余的逗号了吗?这就是典型的语法错误!
验证方法:用系统自带的工具校验JSON格式:
python3 -m json.tool /etc/docker/daemon.json
如果格式有问题,命令会直接报错,告诉你哪里错了,修正后再试。
2. 修改配置后必须重启/重载Docker daemon
光改配置文件没用,Docker daemon不会自动读取新配置,必须手动触发:
- 先试试重载配置(不重启容器,对业务影响小):
sudo systemctl reload docker - 如果重载没生效,就只能重启Docker服务了(注意:会重启所有运行中的容器,建议低峰操作):
sudo systemctl restart docker
3. 看Docker启动日志找报错信息
如果重启后还是不行,直接看Docker daemon的启动日志,里面会明确告诉你配置哪里出问题了:
sudo journalctl -u docker.service -f
找有没有类似invalid config、error parsing daemon.json的报错,跟着提示改就行。
4. 确认GELF接收端没问题
有时候不是Docker的锅,是GELF服务端(比如Graylog)那边的问题:
- 检查
192.168.10.2:12201这个地址是不是能正常访问,防火墙有没有开UDP 12201端口 - 用
nc -u 192.168.10.2 12201测试连通性,随便敲点文字发送,看看服务端能不能收到
5. 注意:全局配置只对新容器生效
划重点!修改全局日志驱动后,只有之后启动的新容器才会用GELF,已经在运行的旧容器不会自动切换。如果想让旧容器也用GELF,要么重启它们,要么手动修改容器的日志配置(不过重启更简单)。
验证配置是否生效
等你修正完配置、重启Docker后,可以这么验证:
- 查看当前Docker的日志驱动配置:
输出里应该能看到docker info | grep -A5 "Logging Driver"gelf字样 - 启动个测试容器发日志:
然后去GELF服务端看看有没有收到这条日志docker run --rm alpine echo "test gelf log"
备注:内容来源于stack exchange,提问作者WoJ

