journald ログドライバー
読む時間の目安: 4 分
ログドライバーjournald
は、コンテナーのログを systemd
ジャーナル へ送信します。
ログ出力された各項目は、journal
API の利用を通じてjournalctl
コマンドを使って確認することができます。
またはdocker logs
コマンドを使って確認することもできます。
journald
ログドライバーはジャーナル内において、元のログメッセージに加えて、以下のメタデータを保存します。
項目 | 内容説明 |
---|---|
CONTAINER_ID |
The container ID truncated to 12 characters. |
CONTAINER_ID_FULL |
64 文字からなる完全なコンテナー ID。 |
CONTAINER_NAME |
ログ出力開始時点でのコンテナー名。docker rename によりコンテナー名を変更しても、ジャーナルエントリには新たな名称は反映されません。 |
CONTAINER_TAG , SYSLOG_IDENTIFIER |
The container tag (log tag option documentation). |
CONTAINER_PARTIAL_MESSAGE |
A field that flags log integrity. Improve logging of long log lines. |
利用方法
デフォルトのログドライバーとしてjournald
を設定するには、daemon.json
ファイル内において、log-driver
とlog-opts
キーを適切に設定します。
daemon.json
は Linux ホストの場合は/etc/docker/
に、また Windows Server の場合はC:\ProgramData\docker\config\daemon.json
にあります。
daemon.json
を用いた Docker の設定方法については daemon.json を参照してください。
以下の例により、ログドライバーをjournald
に設定します。
{
"log-driver": "journald"
}
変更内容を有効にするために Docker デーモンを再起動します。
このログドライバーを特定のコンテナーに対して設定するには、docker run
コマンドにおいて--log-driver
フラグを指定します。
$ docker run --log-driver=journald ...
オプション
ログドライバーjournald
のオプションを指定するには--log-opt NAME=VALUE
フラグを利用します。
オプション | Required | Description |
---|---|---|
tag |
optional | Specify template to set CONTAINER_TAG and SYSLOG_IDENTIFIER value in journald logs. Refer to log tag option documentation to customize the log tag format. |
labels |
optional | Comma-separated list of keys of labels, which should be included in message, if these labels are specified for the container. |
labels-regex |
optional | Similar to and compatible with labels. A regular expression to match logging-related labels. Used for advanced log tag options. |
env |
optional | Comma-separated list of keys of environment variables, which should be included in message, if these variables are specified for the container. |
env-regex |
optional | Similar to and compatible with env. A regular expression to match logging-related environment variables. Used for advanced log tag options. |
If a collision occurs between label and env keys, the value of the env takes precedence. Each option adds additional fields to the attributes of a logging message.
Below is an example of the logging options required to log to journald.
$ docker run \
--log-driver=journald \
--log-opt labels=location \
--log-opt env=TEST \
--env "TEST=false" \
--label location=west \
your/application
This configuration also directs the driver to include in the payload the label
location, and the environment variable TEST. If the --env "TEST=false"
or --label location=west
arguments were omitted, the corresponding key would
not be set in the journald log.
コンテナー名に関するメモ
The value logged in the CONTAINER_NAME
field is the name of the container that
was set at startup. If you use docker rename
to rename a container, the new
name is not reflected in the journal entries. Journal entries continue
to use the original name.
journalctl
を使ったログメッセージの確認
Use the journalctl
command to retrieve log messages. You can apply filter
expressions to limit the retrieved messages to those associated with a specific
container:
$ sudo journalctl CONTAINER_NAME=webserver
You can use additional filters to further limit the messages retrieved. The -b
flag only retrieves messages generated since the last system boot:
$ sudo journalctl -b CONTAINER_NAME=webserver
The -o
flag specifies the format for the retried log messages. Use -o json
to return the log messages in JSON format.
$ sudo journalctl -o json CONTAINER_NAME=webserver
View logs for a container with a TTY enabled
If TTY is enabled on a container you may see [10B blob data]
in the output
when retrieving log messages.
The reason for that is that \r
is appended to the end of the line and
journalctl
doesn’t strip it automatically unless --all
is set:
$ sudo journalctl -b CONTAINER_NAME=webserver --all
Retrieve log messages with the journal
API
This example uses the systemd
Python module to retrieve container
logs:
import systemd.journal
reader = systemd.journal.Reader()
reader.add_match('CONTAINER_NAME=web')
for msg in reader:
print '{CONTAINER_ID_FULL}: {MESSAGE}'.format(**msg)