Dockerのログをホストのrsyslogに溜める

Dockerログをホストのrsyslogに出力する。

環境

  • Docker version 19.03.12, build 48a66213fe
  • rsyslogd 8.24.0-52.el7_8.2

docker-machineで作ったdockerホストに複数のサービスを稼働させる。 各サービスは、docker-composeで行う。これらのサービスのログを収集したい。

方法の検討

いくつか方法がありそうなので検討する。

dockerのデフォルトロギングドライバは変更せず、各サービスのロギングドライバを個々に設定する方針でいきたい。

新しくsyslog用のコンテナを立てる

syslogのコンテナを立て、そちらへロギングするように設定する方法。各サービスにsyslogコンテナを発見できるようにする。

これでは、現状のdockerの構成ではそれぞれにネットワークの割り当てを行う手間が増える。

具体的にいうと、各々のdocker-composeにトップレベルに、networkを追加して、各コンテナ(サービス)にnetworkを追加するという手間がある。(確かこうしないとホスト名を設定してくれなかった気がする。)

それか、docker自体のデフォルトロギングドライバを変更すれば、この設定は不要になる。Configure logging drivers | Docker Documentationのようにデフォルト設定のためにファイルを書き換え(追記す)ればいい。

dockerの考えとしてはこちらの方法がいいのかもしれない。

dockerホストのrsyslogに記録する

ホストでrsyslogdがあればそれを利用するのも方法の一つになる。

上の方法のnetwork設定が不要。dockerでsyslogをロギング方法と指定すれば、デフォルトでホストのsyslogを使ってくれるようだ。

クラスタ利用でもなければこの方法で十分だと思う。

一方で、ホストのrsyslogの設定の管理をする必要がある。

結局ホストのrsyslogで

dockerホストのrsyslogdを利用することにした。以降はこの方法での設定方法をメモとして記録しておく。

設定することは、

  • dockerで稼働するサービスでロギングドライバを変更する
  • ホスト側でrsyslogの設定ファイルを追加する
  • ホスト側でlogrotateの設定ファイルを追加する

の3つ。

各サービスで必要な設定

docker-compose.ymlの各サービスでロギング用の設定を記述する。

こちらは例(抜粋):

services:
  some-app:
    logging:
      driver: syslog
      options:
        syslog-facility: daemon
        tag: <static-tag>/{{.Name}}/{{.ID}}

optionsでオプションを指定可能。有効なオプションは、Syslog logging driver | Docker Documentationに一覧がある。

<static-tag>を使って各サービスの識別を行う。

{{.Name}}などは、Customize log driver output | Docker Documentationに一覧がある。

ホスト側で必要な設定

次はホスト側で必要になる設定を行う。rsyslogの設定とlogrotateの設定の2つ行う。

rsyslogの設定

.confファイルを/etc/rsyslog.d/に置く。その後rsyslogdをリスタートさせればいい。

.confファイルの内容は以下のような感じ:

$template DockerLogs, "/var/log/docker/%programname%"

if $syslogfacility-text == 'daemon' and $programname startswith 'docker-' then -?DockerLogs
# & stopで以降の評価をしない
& stop

%programname%になるのは、tagの静的な部分。つまり、上で述べた<static-tag>のこと。 ドキュメントはこちら: RSyslog Documentation - rsyslog

この例の場合、<static-tag>docker-で始まるもののみを収集することになる。プレフィックスを統一していれば、どんなdockerのサービスのログも<static-tag>以外は同じにしても収集できるという寸法。

ファイルを配置後、rsyslogd -N1コマンドで文法のチェックができる。参考: How can I check the config? - rsyslog

rsyslogdの再起動は、OS毎の方法に沿って行えばいい。systemctlなど。

logrotateの設定

logrotateのグローバルコンフィグだけでは不安なので、ローテーション設定も行う。

.confファイルを/etc/logrotate.d/に格納しておけばいい。cronで動くので、再起動などはいらないはず。

/var/log/docker/docker-* {
    ifempty
    missingok
    weekly
    rotate 10
    dateext
}

# 上のだと動かない場合もあるようだ(ともにlogrotate 3.8.6なのに)
/var/log/docker/*.log {
    ifempty
    missingok
    weekly
    rotate 10
    dateext
}

設定内容はこの辺で勉強する: logrotate(8) - Linux man page

<static-tag>とワイルドカードを使えば、設定は長くならない。

もう一つ注意する点といえば、logrotateの方は.confファイルを移した後、chownなどでオーナーをroot、グループもrootにしてないと存在を認識してくれないようだった。 後から調べて似たような事象を見つけた: logrotateの設定ファイル、オーナーが重要 - Qiita

ログの設定の細かいところは、ログの増加の仕方やログの管理の仕方などで調整すればいいだろう。

おわりに

dockerのデフォルトはstdoutに出力するのみなので、解析しようと思うと少し手間だった。rsyslogであれば確認も転送も楽だろう。


ログ関連書籍(広告)

https://amzn.to/2DZtrjX
https://amzn.to/2E11Vmd
タイトルとURLをコピーしました