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