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

/ets/rsyslog.confを変更

↓imjournalを無効にする。#をつける。
#$ModLoad imjournal # provides access to the systemd journal

↓OmitLocalLoggingをoff
$OmitLocalLogging off

↓imjournal.sateをコメントアウト
$IMJournalStateFile imjournal.state

rsyslogを再起動

# kill (rsyslogのpid)
# /usr/sbin/rsyslogd

※systemctlを使わずにrsyslogを起動するときは、/usr/sbin/rsyslogdを実行。

まとめ

centos7からログ管理にjournalが追加された。

rsyslogはjournal経由でシステムログを取得して/var/log/mesaageに書き込む。

dockerを特権モードで起動すればjournalも起動して、rsyslogでシステムログを書き込める。

特権モードで起動しない時は、/dev/logからrsyslogがシステムログを取得して書き出すように設定を変更する。(journalを経由しない)