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 が stdoutstderr しか無いのよね。
ログファイルを読んで内容をリモートに送るとか、そんなことはできない。

じゃあ諦めて、コンテナに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を入れましょう。