Dockerで複数コンテナを運用する際にログをどう扱うかが課題でした。Docker logs コマンドでホストのコンソールにログを出力できますが実運用には耐えられません。Docker1.6から導入されたロギング・ドライバを使用すれば解決できそうです。
1.ロギング・ドライバ
Dockerコンテナでは、コンテナ作成後にコンテナ内のファイルシステムに書き込まれたデータはコンテナの削除時に一緒に破棄されてしまう。そのため、各種ログやエラーメッセージ出力などの保存しておきたい情報はコンテナ外に出力して保存しておく必要がある。Dockerではこれを支援する機能の1つとして、ログを外部のログ記録ソフトウェアに転送する機構が用意されている。(さくらナレッジより引用)これがロギングドライバと呼ばれる機能でDocker Runでコンテナ起動時には –log-driver=Valueで設定します。何も指定しないとデフォルトではjson-fileになります。docker logsコマンドでログが参照できるのはjson-fileに保存されているからです。Valueで指定できるのは以下の値です。
none |
コンテナ用のロギング・ドライバを無効化します。このドライバを指定したら docker logs は無効化されます。 |
json-file |
Docker 用のデフォルト・ロギング・ドライバです。JSON メッセージをファイルに記録します。 |
syslog |
Docker 用の syslog ロギング・ドライバです。ログ・メッセージを syslog に記録します。 |
journald |
Docker 用の journald ロギング・ドライバです。ログ・メッセージを journald に記録します。 |
gelf |
Docker 用の Graylog Extendef ログ・フォーマット(GELF)ロギング・ドライバです。ログ・メッセージを Graylog のエンドポイントや Logstash に記録します。 |
fluentd |
Docker 用の fluentd ロギング・ドライバです。ログ・メッセージを fluentd に記録します(forward input)。 |
awslogs |
Docker 用の Amazon CloudWatch Logs ロギング・ドライバです。ログ・メッセージを Amazon CloudWatch Logs に記録します。 |
splunk |
Docker 用の Splunk ロギング・ドライバです。HTTP イベント・コレクタを使いログを splunk に書き込みます。 |
etwlogs |
Docker 用の ETW ロギング・ドライバです。ログメッセージを ETW イベントとして書き込みます。 |
gcplogs |
Docker 用の Google Cloud ロギング・ドライバです。ログメッセージを Google Cloud Logging に書き込みます。 |
(Docker マニュアルより)
2.syslogドライバ
今回設定したのはSyslogドライバです。文字通り指定するとコンテナ内のログがホストのsyslogファイに出力されます。Docker-Composeのymlファイル内では以下のように設定します。
1 2 3 4 |
logging: driver: syslog options: syslog-address: "tcp://192.168.3.10:123" |
optionsでsyslog-addressを指定すると外部syslogサーバに送ることも可能です。今回はホストのsyslogファイルに出力するのでOptionsの設定はしていません。
上記設定を追加しコンテナを再起動します。
1 2 |
# docker-compose stop # docker-compose up -d |
syslogに出力されているか確認します。
1 2 |
# less /var/log/messages Mar 20 17:19:31 dock7 0d80a6f749a0[968]: 172.19.0.4 - 20/Mar/2017:17:19:31 +090... |
出力されています。成功です。
3.CentOS7のsyslog出力設定変更
今回、Dockerでsyslog出力するに際して/var/log/messageを覗いたところなにやら不明なログが大量に出力されています。以下のように1時間に1回6行も出力されてます。
1 2 3 4 5 6 7 8 9 10 11 12 |
Mar 19 18:01:01 localhost systemd: Created slice user-0.slice. Mar 19 18:01:01 localhost systemd: Starting user-0.slice. Mar 19 18:01:01 localhost systemd: Started Session 700 of user root. Mar 19 18:01:01 localhost systemd: Starting Session 700 of user root. Mar 19 18:01:01 localhost systemd: Removed slice user-0.slice. Mar 19 18:01:01 localhost systemd: Stopping user-0.slice. Mar 19 19:01:01 localhost systemd: Created slice user-0.slice. Mar 19 19:01:01 localhost systemd: Starting user-0.slice. Mar 19 19:01:01 localhost systemd: Started Session 701 of user root. Mar 19 19:01:01 localhost systemd: Starting Session 701 of user root. Mar 19 19:01:01 localhost systemd: Removed slice user-0.slice. Mar 19 19:01:01 localhost systemd: Stopping user-0.slice. |
ちょっと調べたところ、Centos7ではデフォルトのログレベルがinfoになっていてcron等が実行されるごとに出力されるようです。これだとDockerログが埋もれてしまうのでログレベルを変更して出力を抑止します。/etc/systemd/system.confのログレベルを変更します。
1 2 3 4 |
vi /etc/systemd/system.conf #LogLevel=info ↓ LogLevel=notice |
このあと、
# reboot
または
# shutdown -r now
にて上記ログレベルの変更が有効になります。