dockerにcentos7を入れて利用していますが、/var/log/messageや/var/log/maillogなどが吐き出されずログが取得できませんでした。
docker + centos7 + rsyslogでログを出力させる設定方法
ログが出力されない?
今までdocker + centos6でコンテナを作成して、rsyslogでシステムログを出力させていました。
今回docker + centos7でコンテナを作成して、rsyslogを設定しましたが、まったくログが出力されません。
# logger "test"
などでログ出力テストをしても、/var/log/messageは空でシステムログが出力されません。
コンテナとは言え、ログが取れないのは運用的に面倒です。
障害などがあった時に調査できません。
なぜシステムログが取れないのか
どうやらcentos7からシステムログの管理方法が変わったらしいです。
centos6までは/dev/logからrsyslogがシステムログを受け取って/var/log/messageなどに書き込んでいたようです。
/dev/log -> rsyslog -> /var/log/message
しかし、centos7からは/dev/logとrsyslogの間にjournalが入っていて、rsyslogはjournalからログを受け取って書き込むように変更されました。
/dev/log -> journal -> rsyslog -> /var/log/message
通常はcentos7はインストールするだけでjournalが自動で起動して、ログを管理します。
しかし、dockerコンテナとなると話は別です。
dockerコンテナは基本的に必要のないものは動かしません。
journalは起動していません、その状態でrsyslogだけを起動してもjournalからシステムログを受け取ることができないので、ログは書き出されません。
要は、dockerコンテナでrsyslogでシステムログを書き出すにはjournalも起動すればいいのです。
journalはsystemctlで管理されており、勝手に起動させます。
dockerコンテナ内で、systemctlを有効にするには起動時に- -privilegedを付けて、/sbin/initで特権モードで起動します。
これで、journalが起動して、rsyslog経由で/var/log/messageなどのシステムログを取得することができます。
dockerコンテナを特権モードで起動するの・・・
特権モードで起動すれば、journal経由でrsyslogがシステムログを書き出してくれます。
しかし、本来dockerコンテナは必要最低限のサービスだけを起動するのが美しいとされています。
systemctlを有効にして勝手に色々サービス起動されると、無駄なリソースを消費されてい美しくありません。
特権モードは通常のコンテナではアクセスできないようなリソースにアクセスできるなど、セキュリティ面でも不安があります。
特権モードで運用するのはちょっと抵抗があります、さてどうしたものか・・・
journal経由をやめる
centos7からjournal -> rsyslogでシステムログを書き出していますが、centos6まではrsyslogが自分で頑張っていました。
そうです、journal経由をやめればいいのです。
rsyslogの設定を変更して、journal経由をやめて、/dev/logから直接rsyslogがログを取得してシステムログを/var/log/messageなどに書き込むように変更します。
/etc/rsyslog.d/listen.confを変更する
↓#をつけてコメントアウト。journalを使わずに/dev/logをが使われる。
#$SystemLogSocketName /run/systemd/journal/syslog
/etc/rsyslog.confを変更
↓imjournalを無効にする。#をつける。
#$ModLoad imjournal # provides access to the systemd journal
↓OmitLocalLoggingをoff
$OmitLocalLogging off
↓imjournal.sateをコメントアウト。#をつける。
#$IMJournalStateFile imjournal.state
※systemctlを使わずにrsyslogを起動するときは、/usr/sbin/rsyslogdを実行。
まとめ
centos7からログ管理にjournalが追加された。
rsyslogはjournal経由でシステムログを取得して/var/log/mesaageに書き込む。
dockerを特権モードで起動すればjournalも起動して、rsyslogでシステムログを書き込める。
特権モードで起動しない時は、/dev/logからrsyslogがシステムログを取得して書き出すように設定を変更する。(journalを経由しない)