topic
- dockerの標準出力の行方
- docker logging driverでfluentdを利用する場合
systemdとfluentdとdockerを利用した際に、標準出力の扱いに関して詰まったことがあったので下記に記載しておく。
dockerの標準出力の行方
コンテナでアプリを立ち上げたときに大体の人はdocker logsコマンドでコンテナの標準出力を見ると思う。
(アプリの設定で固定ファイルにログをすべて出力する設定等をしている場合は別だが、log4j2などを使っている場合)
systemdからコンテナを立ち上げた際に、docker logsコマンドで表示される内容がすべてsyslogにも出力されているのをみて、えぇ!!と驚いたのでまとめておく。
コンテナの標準出力=プロセスの標準出力
当たり前の話だが、コンテナの標準出力=プロセスの標準出力なのでコンテナをsystemdで起動した場合コンテナの標準出力はsystemdによって拾われる。
そのため、systemdの設定で標準出力関連の設定をデフォルトにしている場合systemdで管理しているプロセスの標準出力(エラー出力を含む)はsystemd→journalログに拾われるため、結果的に/var/log/messages等のログにも同時出力される。
勘違いした理由としては、docker logsコマンドの説明で、docker logging driverをデフォルトのjsonにしている場合は、コンテナIDごとに指定のファイルパスに標準出力のログファイルが蓄積してて、そこを見てるんだよ。
という旨の記載を見た気がして、じゃあプロセスとしての標準出力としては出なくてどっかで出力がうばわれてるんだなーと勝手に解釈してしまった(馬鹿)ためだ。
よって、ログをjournalに拾われたくない場合はsystemdで下記の設定を行う必要がある。
StandardOutput=null
上記は標準出力のみで標準エラー出力に関しては、以前の通りjournalに出力されるので、必要であればエラー出力に関する設定も同様に存在するのでそちらもいじると良い。
そのまま、出力させるのであれば上記の設定は不要。
logging driverでfluentdを指定した場合に標準出力の行方
dockerの公式ドキュメントにも書いてあるが、docker logging driverでjson以外を設定した場合は、docker logsコマンドを利用することができない。
このため、ほほぉjson以外を設定するとコンテナの標準出力は吸い取られるのか!!(馬鹿)と勘違いしていた。
実際、logging driverをfluentdにしたあとはdocker logsコマンドが使えないので標準出力なくなったのかなーとか考えてたときにjournalログにも同じログが出てる!と気がついて、なんでこっちにもでてるのか散々悩んだ。
結局、logging driverをどんな設定にしてもプロセスの標準出力自体はなくならないのでsystemd(upstart)等で管理する場合は通常と同じようにプロセスの標準出力の扱いに関する注意が必要と言うことである。(当たり前)