LoginSignup
5
4

More than 3 years have passed since last update.

dockerのlog-driverでjournaldを使ったときにコンテナ名を表示させる

Posted at

はじめに

docker [create|run]させるときにlog-driverオプションにてロギング方法を色々と切り替えることができる。
この辺は他のQiitaの記事でも散々既出だと思うので詳細は割愛。

私はlog-driver journaldを多用しているのだが、普通にドライバーを切り替えただけだと、ログの中にCONTAINER_IDしか入っておらず、どのコンテナから出力されたものなのかがイマイチよくわからない。やはりコンテナ名がログに載って欲しい。そっちの方が絶対わかりやすい。

まぁ特定コンテナのログを見たい、という観点で言うならば、docker logs使うとか、journalctl CONTAINER_NAMEを使うとか方法はあるのだけど。

個人的に困ったのは、journaldからsyslog転送されて/var/log/messagesに流れてきた場合。この場合、ログの中身でしか"どのコンテナがどういったログを出力したのか"を判断できない。そうなったときに、やはりログの中にコンテナ名が記載されていると非常に便利なわけだ。

ということで、それを実現するための設定についての記事。

デフォルトの挙動

--log-driver jounarldを指定し、単に"hogehoge"と出力させるコンテナを動かしてみる。

$ docker run --log-driver journald --name test-container centos:7 echo hogehoge
hogehoge

journalctlを使って特定コンテナのログを確認してみる。この場合、明示的にコンテナ名でフィルタリングしているわけだから、まぁログの中にコンテナ名が記載されていなくても特に問題はないだろう。なぜならコマンド実行時点で特定のコンテナを指定しているのだから、表示されるログは常にそのコンテナからのものであると言い切れる。

$ journalctl CONTAINER_NAME=test-container
-- Logs begin at Sun 2019-12-29 13:30:27 JST, end at Sun 2019-12-29 13:46:13 JST. --
Dec 29 13:41:06 test-svr 0c642bc6d137[5193]: hogehoge

RHEL/CentOSだと、特に何も設定しなくてもjournaldからsyslog転送されて、自動的に/var/log/messagesにまで流れてくる。私の場合、全てのコンテナのlog-driverをjournaldにすることで、全てのログを/var/log/messagesに集約し、そこに対してエラーログ監視をしていたりする。
この場合、どのコンテナが出力したものかがわからない。ログの中にある"0c642bc6d137"はコンテナIDだが、いちいち自分が作ったコンテナのIDを記憶している人間はいないだろう。

$ grep hogehoge /var/log/messages
Dec 29 13:41:06 test-svr 0c642bc6d137: hogehoge

解決策

--log-opt tag="{{.Name}}"を指定する。--log-optは本来ログドライバーに対して様々なオプション設定を行うものである。その--log-optのtagに対して、任意文字列を与えると、ログの中でその文字列が表示される。もちろん、スタティックな文字列でも構わないのだが、今回の場合、正しいコンテナ名を動的に入れて欲しい、ということでコンテナ名を表すテンプレート要素である{{.Name}}を指定している。つまり、tag="test-container"としても、同じ結果になる。

$ docker run --log-driver journald --log-opt tag="{{.Name}}" --name test-container centos:7 echo hogehoge
hogehoge

動作確認

journalctlで確認してみる。確かに以前はコンテナIDであった部分がコンテナ名に置き換わっている。

$ journalctl CONTAINER_NAME=test-container
-- Logs begin at Sun 2019-12-29 13:30:27 JST, end at Sun 2019-12-29 13:54:18 JST. --
Dec 29 13:41:06 dev-harvest 0c642bc6d137[5193]: hogehoge
Dec 29 13:54:18 dev-harvest test-container[5193]: hogehoge

肝心の/var/log/messagesでも確認してみる。当然、こちらもコンテナ名に置き換わったログで流れてきている。

$ grep hogehoge /var/log/messages
Dec 29 13:41:06 dev-harvest 0c642bc6d137: hogehoge
Dec 29 13:54:18 dev-harvest test-container: hogehoge

docker-composeの場合

こんな感じ。

docker-compose.yml
version: "3"
services:
  test-container-service:
    image: centos:7
    container_name: test-container
    logging:
      driver: journald
      options:
        tag: "{{.Name}}"

参考

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4