So schreiben Sie Docker-Ausgabe als Daemon in stdout/stderr

So schreiben Sie Docker-Ausgabe als Daemon in stdout/stderr

So können wir einen Docker-Container als Daemon ausführen:

docker run -d --name foo foo

und lesen Sie dann die Protokolle:

docker logs -f foo

aber ich frage mich, wie ich nur in stdout/stderr schreiben kann, damit ich die Protokolle an Splunk oder Cloudwatch usw. senden kann. So etwas wie:

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

wie geht das offiziell?

Antwort1

Sie können Protokollierungsoptionen verwenden, wie von @Michael hervorgehoben und im Folgenden beschrieben.Dokumente

Grundsätzlich gibt es hierfür mindestens zwei Möglichkeiten, die im Folgenden kurz erläutert werden.

  1. Verwenden Sie splunkden Treiber wie in gezeigtHier.

Beginnen Sie mit der Erstellung eines Ereignissammler-Tokens, wie imDokumente. Das Token wird innerhalb der Splunk-Treiberkonfiguration verwendet.

Docker-CLI-Beispiel

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-Beispiel

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. Verwenden Sie syslogden Treiber wie in gezeigtHier.

Docker-CLI-Beispiel:

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

Docker-Compose-Beispiel:

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

Dadurch werden alle Containerprotokolle an das lokale Syslog gesendet. Von dort können Sie sie an den externen UDP-Port weiterleiten, wo Splunk bereit ist, Ihre Protokolle zu empfangen.

Nehmen wir also an, dass der Splunk-Server die Protokolle auf Port empfängt. 514Dann müssen Sie dies zur rsyslogdKonfiguration hinzufügen und dann den rsyslogd-Dienst neu starten.

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

Wenn Sie es alternativ global für alle Container festlegen möchten, können Sie die Protokollierung /etc/docker/daemon.jsonwie unten beschrieben über die Datei selbst konfigurieren (und vergessen Sie nicht, den Docker-Dienst neu zu starten):

Im Falle vonsyslog

{
  "log-driver": "syslog"
}

Im Falle vonsplunk

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

Schauen Sie sich die Liste derunterstützter Protokollierungstreiber

verwandte Informationen