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
aufoff
. - 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.