ロギング ドライバの設定

Docker は複数のログ記録(ロギング)機能を含んでおり、 実行中のコンテナとサービスから情報を得るには が役立ちます。これらの仕組みを ロギング ドライバ(logging driver) と呼びます。各 Docker デーモンにはデフォルトのロギング ドライバがあり、コンテナに対して何らかの別のロギング ドライバを指定するか、省略して「log-driver」を指定しない限り、デフォルトでコンテナに対して適用します。

デフォルトでは Docker は json-file ロギング ドライバ を使います。これはコンテナのログを JSON に含めます。Docker に入っているロギング ドライバに加え、 ロギング ドライバ・プラグイン を使った異なる実装も可能です。

ちなみに

ディスクの肥大化を防止する「local」ロギング ドライバを使う

デフォルトでは、ログのローテーションは処理されません。その結果、デフォルトの json-file ロギング ドライバ によって保管されるログファイルにより、ディスク容量が著しく増える場合があります。これは、コンテナがたくさんの出力を生成し、ディスク容量を大量に消費するためです。

Docker は json-file ロギング ドライバ(ログのローテート無し)をデフォルトで使用します。これは Docker の古いバージョンとの候補互換性を維持し、かつ、Docker が Kubernetes 用のランタイムとして使う状況のためです。

他の状況としては、デフォルトでログローテーションを処理するため、「local」ロギング ドライバが推奨されますし、他にも効率的なファイル形式を利用できます。 デフォルトのロギング ドライバを指定 セクションを参照し、「local」ロギング ドライバをデフォルトに設定する方法を学び、それから、「local」ロギング ドライバの詳細は local file ロギング ドライバ のページをご覧ください。

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

Docker デーモンに対してデフォルトで何らかのロギング ドライバを指定するには、 daemon.json ファイル中の log-driver にロギング ドライバ名を書きます。詳細は dockerd リファレンスマニュアル の「デーモン設定ファイル」セクションをご覧ください。

デフォルトのロギング ドライバは json-file です。以下の例はデフォルトのロギング ドライバを local ログドライバ に設定する例です。

{
  "log-driver": "local"
}

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

{
  "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 データ・ディレクトリのあるホスト・ストレージの容量によって、最大のログファイル情報が決まります。