for nylig modtog jeg en fejlrapport om Docker, der klagede over at bruge rsyslogd i en container.
brugeren kørte en RHEL7-container, installerede rsyslog, startede dæmonen og sendte derefter en logger-besked, og der skete ikke noget.
# docker run -it --rm rhel /bin/bash # yum -y install rsyslog # /usr/sbin/rsyslogd # logger "this is a test"
ingen besked dukkede op i /var/log/messages
i containeren eller på værtsmaskinen for den sags skyld.
brugeren kiggede derefter og bemærkede, at /dev/log
ikke eksisterede, og det var her logger skrev beskeden. Brugeren troede, at dette var en fejl.
problemet var, at vi i RHEL7 og Fedora nu bruger journald, som lytter på /dev/log
til indgående meddelelser. I RHEL7 og Fedora læser rsyslog faktisk meddelelser fra tidsskriftet via dets API som standard.
men ikke alle docker-containere kører systemd og journald. (De fleste gør det ikke). For at få rsyslogd til at fungere som brugeren ønskede, skulle han ændre konfigurationsfilen, /etc/rsyslogd.conf
:
- i
/etc/rsyslog.conf
fjern$ModLoad imjournal
. - sæt
$OmitLocalLogging
tiloff
. - sørg for, at
$ModLoad imuxsock
er til stede. - kommenter også:
$IMJournalStateFile imjournal.state
.
efter at have foretaget disse ændringer begynder rsyslogd at lytte på /dev/log
i beholderen, og loggermeddelelserne accepteres af rsyslogd og skrives til /var/log/messages
i beholderen.
hvis du vil logge beskeder for at gå til værtsloggeren, kan du volumenmontere /dev/log
i containeren.
# docker run -v /dev/log:/dev/log -it --rm rhel /bin/bash # logger "this is a test"
meddelelsen skal vises i værtens journalct-log, og hvis du kører rsyslog på værten, skal meddelelsen ende i /var/log/messages
.