ロギング ドライバの設定¶
Docker は複数のログ記録(ロギング)機能を含んでおり、 実行中のコンテナとサービスから情報を得るには が役立ちます。これらの仕組みを
デフォルトでは 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)によって、アプリケーションからのブロッキングを阻止します。アプリケーションは STDERR
や STDOUT
ストリームのブロックにより、予期しない異常のようになるでしょう。
警告
バッファがいっぱいになり、新しいメッセージが待機状態になると、メモリ上の最も古いメッセージは破棄(drop)されます。メッセージの破棄は、アプリケーションのログ記録プロセスのブロッキングよりも優先されます。
mode
ログオプションは、どこで blocking
(デフォルトでは)、 または non-blocking
メッセージを送信するか制御します。
max-buffer-size
ログオプションは、中間メッセージ・ストレージ用のリング・バッファに使う容量を制御します。 mode
を non-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"}
サポートしているロギング ドライバ¶
以下のロギング ドライバがサポートされています。設定のオプションに関しては、該当する各ドライバのドキュメントへのリンクをご覧ください。 ロギング ドライバ・プラグイン の利用時には、さらにオプションがあるでしょう。
ドライバ |
説明 |
---|---|
|
コンテナに対するログを記録せず、 |
ログは最小のオーバヘッドになるよう設計された、カスタム形式で記録します。 |
|
JSON 形式でログを記録します。Docker のデフォルトのロギング ドライバです。 |
|
|
|
ログメッセージを |
|
ログメッセージを Graylog または Logstach などのような Graylog Extended Log Format (GELF) エンドポイントに記録します。 |
|
ログメッセージを |
|
ログメッセージを Amazon CloudWatch Logs に記録します。 |
|
HTTP Event Collector を使い、 |
|
Event Tracing for Windows (ETW) events としてログメッセージを記録します。Windows プラットフォーム上で利用可能です。 |
|
Google Cloud Platform (GCP) ロギングにログメッセージを記録します。 |
|
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 データ・ディレクトリのあるホスト・ストレージの容量によって、最大のログファイル情報が決まります。
参考
- Configure logging drivers
https://docs.docker.com/config/containers/logging/configure/