使用Splunk日志驱动时Docker syslog-ng容器日志能否输出到stdout和stderr
问题根因
你当前的方案失效核心有两个原因:
- 你在
docker exec会话中创建的软链接指向的是当前exec会话进程的标准输出,而非容器内1号主进程(syslog-ng进程)的标准输出。Docker日志驱动仅捕获1号进程的stdout/stderr输出,因此你写入/var/log/messages的内容无法被Docker采集到。 - 临时创建的软链接会在容器重启后失效,无法持久化生效。
解决方案
方案1:修改syslog-ng配置(推荐,持久化生效)
直接在syslog-ng中新增标准输出的输出目标即可,步骤如下:
- 本地新建一个syslog-ng配置文件
stdout-output.conf,内容如下:
# 定义输出到stdout的目标 destination d_stdout { file("/dev/stdout" perm(0644)); }; # 绑定默认接收syslog的源到stdout输出目标 log { source(s_src); destination(d_stdout); };
注:如果默认的接收源名称不是s_src,可以查看容器内/etc/syslog-ng/syslog-ng.conf中的源配置名称替换即可
2. 修改你的docker-compose.yml,新增volume挂载,把本地配置文件挂载到syslog-ng的自定义配置目录:
version: '3.9' services: syslog-ng: image: balabit/syslog-ng:latest ports: - "514:514/udp" - "601:601" # 新增配置挂载 volumes: - ./stdout-output.conf:/etc/syslog-ng/conf.d/stdout-output.conf logging: driver: "splunk" options: splunk-token: "XXXX" splunk-url: "https://XXXX.splunkcloud.com" splunk-insecureskipverify: "true" tag: "{{.Name}}/{{.FullID}}" labels: type,location env: "os" labels: type: syslog location: home environment: - os=debian restart: unless-stopped
- 重启容器生效,之后syslog-ng接收到的所有日志会同时输出到stdout,被Docker的splunk日志驱动采集上报。
方案2:临时修改软链接(仅测试用,重启失效)
如果仅需临时测试,可以直接将软链接指向1号进程的标准输出:
ln -sf /proc/1/fd/1 /var/log/messages
修改完成后再发送测试日志,即可在docker logs和Splunk中看到对应日志。
内容的提问来源于stack exchange,提问作者Kade Williams
相关产品推荐
相关产品推荐

