如何作为守护进程将 docker 输出写入 stdout/stderr

如何作为守护进程将 docker 输出写入 stdout/stderr

因此我们可以将 docker 容器作为守护进程运行:

docker run -d --name foo foo

然后读取日志:

docker logs -f foo

但我想知道如何仅写入 stdout/stderr,以便我可以将日志发送到 splunk 或 cloudwatch 等。类似于:

(
  docker run --name foo foo &|  capture_logs
) & disown

官方的做法是什么?

答案1

您可以使用@Michael指出的日志记录选项,如下所述文档

一般来说,至少有两种方法可以做到这一点,下面将简要讨论。

  1. 使用splunk驱动程序,如下所示这里

首先创建一个事件收集器令牌,如文档. 该令牌将在 splunk 驱动程序配置中使用。

docker cli 示例

docker run -d \
           --log-driver=splunk \
           --log-opt splunk-token=176FCEBF-4CF5-4EDF-91BC-703796522D20 \
           --log-opt splunk-url=https://splunkhost:8088 \
           --log-opt tag=foo-logs \
           --name foo foo

docker-compose 示例

version: '3.7'
services:
  foo_app:
  ...
  logging:
    driver: splunk
    options:
      tag: foo-logs
      splunk-token: 176FCEBF-4CF5-4EDF-91BC-703796522D20
      splunk-url: https://splunkhost:8088
  ...
  1. 使用syslog驱动程序,如下所示这里

docker cli示例:

docker run \
      -–log-driver syslog –-log-opt tag=foo-logs \
      --name foo foo

docker-compose示例:

version: '3.7'
services:
  foo_app:
  ...
  logging:
    driver: syslog
    options:
      tag: foo-logs
  ...

这会将所有容器日志发送到本地系统日志,您可以从那里获取这些日志并将其转发到外部 udp 端口​​,splunk 已准备好接收您的日志。

因此,假设 Splunk 服务器将接收端口上的日志,514那么您需要将其添加到rsyslogd配置中,然后重新启动 rsyslogd 服务

# /etc/rsyslog.d/20-splunk.conf
:syslogtag, contains, "foo-logs" @splunk_url:514;RSYSLOG_SyslogProtocol23Format

或者,如果您打算将其设置为所有容器的全局变量,那么您可以/etc/docker/daemon.json像下面这样通过文件本身配置日志记录(并且不要忘记重新启动 docker 服务):

的情况下syslog

{
  "log-driver": "syslog"
}

的情况下splunk

{
  "log-driver": "splunk",
  "log-opts": {
    "splunk-token": "176FCEBF-4CF5-4EDF-91BC-703796522D20",
    "splunk-url": "https://splunkhost:8088",
    ...
  }
}

查看列表支持的日志驱动程序

相关内容