ロギング・ドライバの設定¶
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 をご覧ください。以下のロギング・ソリューションのほか、サードパーティのものも含みます。sysloggelffluentdawslogssplunketwlogsgcplogsLogentries
Docker Community Engine を使う場合は、
docker logsコマンドは以下のドライバのみ利用可能です。localjson-filejournald
- 圧縮されローテートされたログファイルから、ログ情報を読み込む必要がある場合、一時的なディスク使用率が増加(ローテートされたファイルからログエントリを読み込むまで)を引き起こしたり、展開中に CPU 使用率を増加を引き起こします。
- Docker データ・ディレクトリのあるホスト・ストレージの容量によって、最大のログファイル情報が決まります。
参考
- Configure logging drivers
- https://docs.docker.com/config/containers/logging/configure/