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であれば確認も転送も楽だろう。
ログ関連書籍(広告)