recent am primit un raport de eroare pe Docker plângându-se despre utilizarea rsyslogd într-un container.
utilizatorul a rulat un container RHEL7, a instalat rsyslog, a pornit daemonul și apoi a trimis un mesaj de înregistrare și nu s-a întâmplat nimic.
# docker run -it --rm rhel /bin/bash # yum -y install rsyslog # /usr/sbin/rsyslogd # logger "this is a test"
niciun mesaj Nu a apărut în /var/log/messages
în container sau pe mașina gazdă.
utilizatorul s-a uitat apoi și a observat că /dev/log
nu exista și aici scria logger mesajul. Utilizatorul a crezut că este un bug.
problema a fost că în RHEL7 și Fedora folosim acum journald, care ascultă pe /dev/log
pentru mesajele primite. În RHEL7 și Fedora, rsyslog citește de fapt mesaje din jurnal prin API-ul său în mod implicit.
dar nu toate containerele docker rulează systemd și journald. (Majoritatea nu). Pentru ca rsyslogd să funcționeze așa cum dorea utilizatorul, ar trebui să modifice fișierul de configurare, /etc/rsyslogd.conf
:
- în
/etc/rsyslog.conf
eliminați$ModLoad imjournal
. - setați
$OmitLocalLogging
laoff
. - asigurați-vă că
$ModLoad imuxsock
este prezent. - de asemenea, comentați:
$IMJournalStateFile imjournal.state
.
după efectuarea acestor modificări rsyslogd va începe să asculte pe /dev/log
în interiorul containerului și mesajele logger vor fi acceptate de rsyslogd și scrise la /var/log/messages
în interiorul containerului.
dacă doriți să logare mesaje pentru a merge la logger gazdă, ai putea volum mount /dev/log
în container.
# docker run -v /dev/log:/dev/log -it --rm rhel /bin/bash # logger "this is a test"
mesajul ar trebui să apară în Jurnalul journalct al gazdei și, dacă executați rsyslog pe gazdă, mesajul ar trebui să ajungă în /var/log/messages
.