ロギング・ドライバの設定

Docker は複数のログ記録(ロギング)機能を含んでおり、 実行中のコンテナとサービスから情報を得るには が役立ちます。これらの仕組みをロギング・ドライバ(logging driver)と呼びます。

各 Docker デーモンにはデフォルトのロギング・ドライバがあり、コンテナに対して何らかの別のロギング・ドライバを指定しない限り、デフォルトでコンテナに対して適用します。

Docker に含むロギング・ドライバに加え、 ロギング・ドライバ・プラグイン を使った異なる実装も可能です。

デフォルトのロギング・ドライバを指定

Docker デーモンに対してデフォルトで何らかのロギング・ドライバを指定するには、 daemon.json ファイル中の log-driver にロギング・ドライバ名を書きます。このファイルは Linux ホスト上では /etc/docker にあり、 Windows サーバ・ホスト上では C:\ProgramData\docker\config\ にあります。デフォルトのロギング・ドライバは json-file です。以下の例は、デフォルトのロギング・ドライバとして syslog を明示しています。

{
  "log-driver": "syslog"
}

もしもロギング・ドライバに設定可能なオプションがあれば、 daemon.json ファイルの中で、 log-opts をキーとする JSON オブジェクトとして記述できます。以下の例は json-file ロギング・ドライバ上で2つのオプションを設定しています。

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3",
    "labels": "production_status",
    "env": "os,customer"
  }
}

注釈

daemon.json 設定ファイル中における log-opts 設定は、文字列として指定する必要があります。そのため、論理型(boolean)や整数値( max-file``の値など )を使う場合は、引用符( ``" )で囲む必要があります。

ロギング・ドライバを指定しなければ、デフォルトは json-file です。つまり、 docker inspect <コンテナ> のコマンド出力は、デフォルトで JSON 形式です。

Docker デーモンにおける現在のデフォルトのロギング・ドライバを調べるには、 docker info を実行し、 Logging Driver を探します。Linux や macOS や Windows の PowerShell 上であれば、以下のコマンドも実行できます。

$ docker info --format '{{.LoggingDriver}}'

json-file

コンテナに対してロギング・ドライバを設定

コンテナの起動時に --log-driver を使えば、Docker デーモンのデフォルト設定とは異なるロギング・ドライバを指定できます。ロギング・ドライガに設定可能なオプションがあれば、1つまたは複数の項目を --log-opt <名前>=<値> フラグで指定できます。もしもコンテナがデフォルトのロギング・ドライバを使用する場合でも、異なる設定可能なオプションを指定できます。

以下は Alpine コンテナを none ロギング・ドライバで起動する例です。

$ docker run -it --log-driver none alpine ash

実行中のコンテナに対して、現在のデフォルトのロギング・ドライバを調べるには、もしもデーモンが json-file ロギング・ドライバを使う場合、 docker inspect コマンドを使い、あとには <コンテナ> の名前または ID を続けます:

$ docker inspect -f '{{.HostConfig.LogConfig.Type}}' <CONTAINER>

json-file

コンテナからログ・ドライバに対する、ログメッセージの転送モードを設定

コンテナからログ・ドライバにメッセージを転送するために、 Docker には2つのモードがあります。

  • (デフォルト)コンテナからドライバに対して、直接、ブロッキング・デリバリ(blocking delivery)
  • ドライバが消費する中間コンテナごとのリング・バッファに、ログ・メッセージを保管する非ブロッキング・デリバリ(non-blocking delivery)

non-blocking メッセージ・デリバリ・モードでは、ロギング・バック圧縮(logging back pressure)によって、アプリケーションからのブロッキングを阻止します。アプリケーションは STDERRSTDOUT ストリームのブロックにより、予期しない異常のようになるでしょう。

警告

バッファがいっぱいになり、新しいメッセージが待機状態になると、メモリ上の最も古いメッセージは破棄(drop)されます。メッセージの破棄は、アプリケーションのログ記録プロセスのブロッキングよりも優先されます。

mode ログオプションは、どこで blocking (デフォルトでは)、 または non-blocking メッセージを送信するか制御します。

max-buffer-size ログオプションは、中間メッセージ・ストレージ用のリング・バッファに使う容量を制御します。 modenon-blocking に設定すると、max-buffer-size はデフォルトで 1 メガバイトになります。

以下はログ出力を non-blocking モードかつ 4 メガバイトのバッファで Alpine コンテナを起動する例です。

$ docker run -it --log-opt mode=non-blocking --log-opt max-buffer-size=4m alpine ping 127.0.0.1

ロギング・ドライバで環境変数やラベルを使う

いくつかのロギング・ドライバは、コンテナの --env|-e--label フラグを使い、コンテナのログに値を追加できます。この例は、Docker デーモンのデフォルトのロギング・ドライバ( json-file と仮定します)でコンテナを起動しますが、環境変数を os=ubuntu に設定します。

$ docker run -dit --label production_status=testing -e os=ubuntu alpine sh

ロギング・ドライバがサポートしていれば、ログの出力に追加のフィールドを追加出来ます。以下の出力は json-file ロギング・ドライバによって生成された出力です。

"attrs":{"production_status":"testing","os":"ubuntu"}

サポートしているロギング・ドライバ

以下のロギング・ドライバがサポートされています。設定のオプションに関しては、該当する各ドライバのドキュメントへのリンクをご覧ください。 ロギング・ドライバ・プラグイン の利用時には、さらにオプションがあるでしょう。

ドライバ 説明
none コンテナに対するログを記録せず、 docker logs は何も出力しません。
local ログは最小のオーバヘッドになるよう設計された、カスタム形式で記録します。
json-file JSON 形式でログを記録します。Docker のデフォルトのロギング・ドライバです。
syslog syslog ファシリティに対してロギング・メッセージを記録します。ホスト・マシン上で syslog デーモンの起動が必要です。
journald ログメッセージを journald に記録します。ホスト・マシン上で journald デーモンの起動が必要です。
gelf ログメッセージを Graylog または Logstach などのような Graylog Extended Log Format (GELF) エンドポイントに記録します。
fluentd ログメッセージを fluentd に記録(forward input)します。ホスト・マシン上で fluentd デーモンの起動が必要です。
awslogs ログメッセージを Amazon CloudWatch Logs に記録します。
splunk HTTP Event Collector を使い、 splunk にログメッセージを記録します。
etwlogs Event Tracing for Windows (ETW) events としてログメッセージを記録します。Windows プラットフォーム上で利用可能です。
gcplogs Google Cloud Platform (GCP) ロギングにログメッセージを記録します。
logentries Rapid7 Logentries に対してログメッセージを記録します。

ロギング・ドライバの制限

  • Docker Enterprise のユーザは "dual logging" を利用できます。これは docker logs コマンドであらゆるロギング・ドライバを利用可にします。 docker logs を使ってローカルでコンテナのログを読むための情報は reading logs when using remote logging drivers をご覧ください。以下のロギング・ソリューションのほか、サードパーティのものも含みます。

    • syslog
    • gelf
    • fluentd
    • awslogs
    • splunk
    • etwlogs
    • gcplogs
    • Logentries
  • Docker Community Engine を使う場合は、 docker logs コマンドは以下のドライバのみ利用可能です。

    • local
    • json-file
    • journald
  • 圧縮されローテートされたログファイルから、ログ情報を読み込む必要がある場合、一時的なディスク使用率が増加(ローテートされたファイルからログエントリを読み込むまで)を引き起こしたり、展開中に CPU 使用率を増加を引き起こします。
  • Docker データ・ディレクトリのあるホスト・ストレージの容量によって、最大のログファイル情報が決まります。