最近、コンテナ内でrsyslogdを使用することについて不平を言うDockerに関するバグレポートを受け取りました。
ユーザーはRHEL7コンテナを実行し、rsyslogをインストールし、デーモンを起動してからloggerメッセージを送信しましたが、何も起こりませんでした。
# docker run -it --rm rhel /bin/bash # yum -y install rsyslog # /usr/sbin/rsyslogd # logger "this is a test"
コンテナ内、またはホストマシン上にメッセージが表示されませんでした。
その後、ユーザーは/dev/log
が存在しないことに気付き、loggerがメッセージを書いていた場所でした。 ユーザーはこれがバグだと思っていました。
問題は、RHEL7とFedoraでは、受信メッセージを/dev/log
でリッスンするjournaldを使用することでした。 RHEL7とFedoraでは、rsyslogは実際にはデフォルトでAPIを介してジャーナルからメッセージを読み取ります。
しかし、すべてのdockerコンテナがsystemdとjournaldを実行するわけではありません。 (ほとんどはそうではありません)。 Rsyslogdをユーザーが望むように動作させるには、設定ファイルを変更する必要があります, /etc/rsyslogd.conf
:
/etc/rsyslog.conf
で$ModLoad imjournal
を削除します。$OmitLocalLogging
をoff
に設定します。$ModLoad imuxsock
が存在することを確認します。- もコメントアウト:
$IMJournalStateFile imjournal.state
。
これらの変更を行った後、rsyslogdはコンテナ内の/dev/log
でリッスンを開始し、ロガーメッセージはrsyslogdによって受け入れられ、コンテナ内の/var/log/messages
に書き込まれます。
ホストロガーに行くためにメッセージをログに記録したい場合は、/dev/log
をコンテナにボリュームマウントすることができます。
# docker run -v /dev/log:/dev/log -it --rm rhel /bin/bash # logger "this is a test"
メッセージはホストのjournalctログに表示され、ホストでrsyslogを実行している場合、メッセージは/var/log/messages
になります。