はじめに
docker [create|run]
するときにlog-driver journald
を使った場合、当然だがログはsystemd-journaldに転送されるため、journalctlで簡単にログを表示できる。
このときjournalctl -xu docker
とすると、確かにコンテナが出力したログを確認することができるのだが、全てのコンテナからのログがごちゃ混ぜで表示されてしまう。
というか、dockerのデーモン自体が出力したログも入っている。これでは何とも使い勝手が悪い。
というわけで、journalctlで特定コンテナのログだけを表示させたいときのTips
準備
まずはhogehogeと出力させるだけのコンテナを一発実行。
$ docker run --log-driver journald --name test-container centos:7 echo hogehoge
hogehoge
方法
journalctl CONTANINER_NAME=[container_name]
を使うと、特定コンテナを狙い撃ちにできる。
$ journalctl CONTAINER_NAME=test-container
-- Logs begin at Sat 2019-02-02 08:29:38 UTC, end at Sun 2019-12-29 01:44:56 UTC. --
Dec 29 01:44:56 ubuntu-bionic 98ece5257dc7[1017]: hogehoge
今回はコンテナ名つまりCONTAINER_NAMEを使ったが、CONTAINER_IDでもOK
余談
journalctl -o json
を使って詳細情報を表示させると、CONTAINER_NAME以外の属性値も確認できる。と言っても、CONTAINER_NAMEやCONTAINER_IDくらいしか使うことはないと思うが。
$ journalctl -o json CONTAINER_NAME=test-container | jq
{
"__CURSOR": "s=6afb2a3be4b044a1aeb269e270aded83;i=8de88;b=b81e15b81ec04ea1839e7027bc5df5ca;m=20071659f;t=59acddfc18d7d;x=73e78ea64ae3ee63",
"__REALTIME_TIMESTAMP": "1577583896530301",
"__MONOTONIC_TIMESTAMP": "8597366175",
"_BOOT_ID": "b81e15b81ec04ea1839e7027bc5df5ca",
"PRIORITY": "6",
"_TRANSPORT": "journal",
"_UID": "0",
"_GID": "0",
"_CAP_EFFECTIVE": "3fffffffff",
"_SELINUX_CONTEXT": "unconfined\n",
"_MACHINE_ID": "b01b43c28d6c4150a4a097c673e8415e",
"_HOSTNAME": "ubuntu-bionic",
"_SYSTEMD_SLICE": "system.slice",
"_PID": "1017",
"_COMM": "dockerd",
"_EXE": "/usr/bin/dockerd",
"_CMDLINE": "/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock",
"_SYSTEMD_CGROUP": "/system.slice/docker.service",
"_SYSTEMD_UNIT": "docker.service",
"_SYSTEMD_INVOCATION_ID": "e75cc9d178354d2f9d434cd8772bd866",
"MESSAGE": "hogehoge",
"IMAGE_NAME": "centos:7",
"CONTAINER_NAME": "test-container",
"CONTAINER_TAG": "98ece5257dc7",
"SYSLOG_IDENTIFIER": "98ece5257dc7",
"CONTAINER_ID": "98ece5257dc7",
"CONTAINER_ID_FULL": "98ece5257dc7ad81be764ffbbebfb0af78c67e4b942e8ef497d286dc5e6e9156",
"_SOURCE_REALTIME_TIMESTAMP": "1577583896529406"
}
あとがき
まぁ特定コンテナのログ見たいだけならdocker logs
でいいやんけって話ではある。場合によってはjournalctlを使いたいシーンもあるだろう。実際、フィルタリングなども容易なので私はjournalctlを使うことが多い。