Ausführen von Syslog in einem Docker-Container -Project Atomic

Kürzlich erhielt ich einen Fehlerbericht über Docker, in dem ich mich über die Verwendung von rsyslogd in einem Container beschwerte.

Der Benutzer hat einen RHEL7-Container ausgeführt, rsyslog installiert, den Daemon gestartet und dann eine Logger-Nachricht gesendet, und nichts ist passiert.

# docker run -it --rm rhel /bin/bash # yum -y install rsyslog # /usr/sbin/rsyslogd # logger "this is a test" 

In /var/log/messages im Container oder auf dem Hostcomputer wurde keine Nachricht angezeigt.

Der Benutzer schaute dann und bemerkte, dass /dev/log nicht existierte und hier logger die Nachricht schrieb. Der Benutzer dachte, dies sei ein Fehler.

Das Problem war, dass wir in RHEL7 und Fedora jetzt journald verwenden, das /dev/log auf eingehende Nachrichten abhört. In RHEL7 und Fedora liest rsyslog standardmäßig Nachrichten aus dem Journal über seine API.

Aber nicht alle Docker-Container führen systemd und journald aus. (Die meisten nicht). Damit rsyslogd so funktioniert, wie es der Benutzer möchte, müsste er die Konfigurationsdatei ändern, /etc/rsyslogd.conf:

  • In /etc/rsyslog.conf entfernen Sie $ModLoad imjournal.
  • Setzen Sie $OmitLocalLogging auf off.
  • Stellen Sie sicher, dass $ModLoad imuxsock vorhanden ist.
  • Auch auskommentieren: $IMJournalStateFile imjournal.state.

Nachdem diese Änderungen vorgenommen wurden, beginnt rsyslogd mit dem Abhören von /dev/log im Container und die Logger-Nachrichten werden von rsyslogd akzeptiert und in /var/log/messages im Container geschrieben.

Wenn Sie Nachrichten protokollieren möchten, um zum Host-Logger zu gelangen, können Sie volume mount /dev/log in den Container einhängen.

# docker run -v /dev/log:/dev/log -it --rm rhel /bin/bash # logger "this is a test" 

Die Nachricht sollte im Journalct-Protokoll des Hosts angezeigt werden, und wenn Sie rsyslog auf dem Host ausführen, sollte die Nachricht in /var/log/messages enden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.