ロギング・ドライバの設定¶
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-dirver
を使えば、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"}
サポートしているロギング・ドライバ¶
以下のロギング・ドライバがサポートされています。設定のオプションに関しては、該当する各ドライバのドキュメントへのリンクをご覧ください。 ロギング・ドライバ・プラグイン の利用時には、さらにオプションがあるでしょう。
ドライバ | 説明 |
---|---|
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 データ・ディレクトリのあるホスト・ストレージの容量によって、最大のログファイル情報が決まります。
参考
- Configure logging drivers
- https://docs.docker.com/config/containers/logging/configure/