Como escrever a saída do docker em stdout/stderr como daemon

Como escrever a saída do docker em stdout/stderr como daemon

Portanto, podemos executar um contêiner docker como um daemon:

docker run -d --name foo foo

e depois leia os logs:

docker logs -f foo

mas estou me perguntando como escrever apenas em stdout/stderr, para poder enviar os logs para splunk ou cloudwatch etc.

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

qual é a maneira oficial de fazer isso?

Responder1

Você pode usar opções de registro como @Michael apontou e conforme descrito a seguirdocumentos

De modo geral, existem pelo menos duas maneiras de fazer isso, que serão discutidas brevemente a seguir.

  1. Usando splunko driver conforme mostrado emaqui.

Comece criando um token coletor de eventos conforme descrito nodocumentos. O token será usado na configuração do driver splunk.

exemplo do 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

exemplo 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. Usando syslogo driver conforme mostrado emaqui.

exemplo do docker cli:

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

exemplo docker-compose:

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

Isso enviará todos os logs do contêiner para o syslog local, você pode retirá-los de lá e encaminhá-los para a porta udp externa, onde o splunk está pronto para receber seus logs.

Então, digamos que o servidor Splunk receberá os logs na porta, 514então você precisa adicionar isso à rsyslogdconfiguração e reiniciar o serviço rsyslogd

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

Alternativamente, se você pretende torná-lo global para todos os contêineres, você pode configurar o log através do /etc/docker/daemon.jsonpróprio arquivo como abaixo (e não se esqueça de reiniciar o serviço docker):

No caso desyslog

{
  "log-driver": "syslog"
}

No caso desplunk

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

Confira a lista dedriver de registro compatível

informação relacionada