You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Splunk日志驱动时Docker syslog-ng容器日志能否输出到stdout和stderr

问题根因

你当前的方案失效核心有两个原因:

  1. 你在docker exec会话中创建的软链接指向的是当前exec会话进程的标准输出,而非容器内1号主进程(syslog-ng进程)的标准输出。Docker日志驱动仅捕获1号进程的stdout/stderr输出,因此你写入/var/log/messages的内容无法被Docker采集到。
  2. 临时创建的软链接会在容器重启后失效,无法持久化生效。

解决方案

方案1:修改syslog-ng配置(推荐,持久化生效)

直接在syslog-ng中新增标准输出的输出目标即可,步骤如下:

  1. 本地新建一个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
  1. 重启容器生效,之后syslog-ng接收到的所有日志会同时输出到stdout,被Docker的splunk日志驱动采集上报。

方案2:临时修改软链接(仅测试用,重启失效)

如果仅需临时测试,可以直接将软链接指向1号进程的标准输出:

ln -sf /proc/1/fd/1 /var/log/messages

修改完成后再发送测试日志,即可在docker logs和Splunk中看到对应日志。


内容的提问来源于stack exchange,提问作者Kade Williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:21:03