journald ログドライバー

読む時間の目安: 4 分

ログドライバーjournaldは、コンテナーのログを systemdジャーナル へ送信します。 ログ出力された各項目は、journalAPI の利用を通じて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-driverlog-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)
Journald, docker, logging, driver