IT二刀流にはプロモーションが含まれています。

docker + centos7でrsyslogが動かない!?ログが出力させる設定

CPU

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を経由しない)

ITエンジニアの転職

いまITエンジニアの需要は急拡大しています。
ITエンジニアの経験があれば好条件で転職することも難しくありません。

転職ドラフト

☆ 支援ご協力のお願い ☆

この記事が「役に立った」と感じたら

投げ銭の「OFUSEで応援」で支援して頂けたら励みになります!

OFUSEのやり方(説明)

関連記事
記事特集