Docker Logging Driver の fluentd プラグインを使って maillog をホストに持って来・・・たかった
Dockerでメールサーバー作ったけど、メールログがローテートされなかった。
原因はシンプルで、cronが入ってなくてローテートが動いていなかった。
普通ならパッケージ入れてはい終了、なんだけど
Dockerの Logging Driver に fluentdが追加されたとか聞いたんですよ。
/var/log/maillog の内容をリモートに飛ばせるなら夢がひろがりんぐ
とか思って、Loggin Driver とか fluentd とかよく知らないままにとりかかる。
ホストOSは Amazon Linux バージョンは 2015.03
$ cat /etc/system-release Amazon Linux AMI release 2015.03
環境構築は先人にならう。感謝。
DockerのFluentd Logging Driverを試してみる | Developers.IO
Docker Logging Driver の fluentd のドキュメント。
Fluentd logging driver
ここで気が付いたけど、source が stdout
と stderr
しか無いのよね。
ログファイルを読んで内容をリモートに送るとか、そんなことはできない。
じゃあ諦めて、コンテナにcron入れるか、fluentd入れて飛ばそう!
と思うじゃん?
この時すでに4時間ぐらい格闘していたので、諦めるには惜しくなったのです。
そしてメールログの内容を標準出力に出せば、dockerが拾ってくれるぞ!
という電波を受信して、さっそく実行。
syslogのmailファシリティを標準出力に。
# vim /etc/rsyslog.conf mail.* -/var/log/maillog ↓ mail.* /dev/console
とりあえずコンテナの標準出力を全部ファイルに出力
# cat /etc/td-agent/td-agent.conf <source> type forward </source> <match docker.**> type file path /var/log/td-agent/docker </match>
接続してみると、無事にログに出力されました。
# telnet [docker container] 25 ---- 2015-09-04T02:35:06+00:00 docker.c00f3fb20b3e { "container_name":"/test", "source":"stdout","log":"\u001B[?1049h\u001B[?1h\u001B=\rSep 4 02:35:01 test postfix/smtpd[179]: connect from localhost[::1]\r", "container_id":"c00f3fb20b3e9c068c062ac563d3bf35182ad64cee303955af9aa49358d3db5c" }
あとはプラグインでログを整形してから出力すれば、きちんとしたものが見れそう。
Logging Driverを使ってみた感想としては、ログを標準出力に書くアプリケーションなら超絶便利そう。
既成品なら、標準出力/エラー出力だけしか取れないので微妙。
素直にホストをマウントしてローテートをホストに任せるか、コンテナにfluentdとcronを入れましょう。