Как записать вывод 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",
    ...
  }
}

Проверьте списокподдерживаемый драйвер регистрации

Связанный контент