リモートログドライバーを使った docker logs の利用

読む時間の目安: 3 分

概要

Docker Engine 20.10 より前は、docker logsを実行してコンテナーログを参照する際には、ログドライバーとしてlocaljson-filejournaldしかサポートされていませんでした。 他にもサードパーティー製のログドライバーはあったのですが、docker logsを使ってローカルでログを参照することはサポートされていませんでした。

そういった状態でログデータを収集するのは、自動化されていようが普通に行うのであろうが、大いに問題を引き起こしていました。 サードパーティー製のログソリューションを利用した場合、ログ情報はそのサードパーティーが提供するツールが指定する書式でしか、アクセスできず参照もできませんでした。

Docker Engine 20.10 からは、ログドライバーやプラグインを設定するしないに関わらず、コンテナーのログを参照するにはdocker logsを使えばよいことになりました。 この機能は「デュアルログ」(dual logging)と呼ばれることがあります。 この機能を利用すると、リモートログドライバーが利用されていたとしても、docker logsを実行してローカルなコンテナーログを参照するだけでよく、一定の書式でログが得られることになります。 というのも、Engine が「ローカルな」ログドライバーに合わせて、ログ情報を設定してくれるからです。 詳細な情報については デフォルトのログドライバーの設定 を参照してください。

デュアルログでは local ログドライバーが利用され、これを使ってコンテナーの最新ログを読み込むキャッシュとして動作します。 デフォルトでそのキャッシュは、ログファイルのローテーションを有効にしており、このログファイルはコンテナーごとに最大 5 ファイルまで、また各ファイルは(圧縮前サイズとして)20 MB までの範囲で利用可能です。

このデフォルトを変更する方法は 設定オプション の節を参照してください。 またこの機能を無効にする方法は デュアルログの無効化 の節を参照してください。

前提条件

デュアルログを利用するために設定変更する必要はありません。 Docker Engine 20.10 またはそれ以降においては、設定されたログドライバーにログ読み込み機能がサポートされていない場合には、自動的にデュアルログ機能が有効になります。

以下の例は、デュアルログ機能がある場合とない場合において、docker logsコマンドを実行した結果を示すものです。

デュアルログ機能がない場合

コンテナーに対してsplunkのようなリモートログドライバーが設定されていて、さらにデュアルログが無効化されている場合、ローカルのコンテナーログを参照しようとすると、エラーが表示されます。

  • 手順 1: Docker デーモンを設定します。

      $ cat /etc/docker/daemon.json
      {
        "log-driver": "splunk",
        "log-opts": {
          "cache-disabled": "true",
          ... ("splunk" ログドライバーのオプション指定)
        }
      }
    
  • 手順 2: コンテナーを起動します。

      $ docker run -d busybox --name testlog top
    
  • 手順 3: コンテナーログを確認します。

      $ docker logs 7d6ac83a89a0
      Error response from daemon: configured logging driver does not support reading
    

デュアルログ機能がある場合

デュアルログによるキャッシュを有効にしていればdocker logsによってログを参照できます。 これはログドライバーがログ読み込みに対応していなくても可能になります。 以下の例は、デーモン設定においてデフォルトとしてリモートログドライバーにsplunkを利用し、デュアルログキャッシュを有効にするものです。

  • 手順 1: Docker デーモンを設定します。

      $ cat /etc/docker/daemon.json
      {
        "log-driver": "splunk",
        "log-opts": {
          ... ("splunk" ログドライバーのオプション指定)
        }
      }
    
  • 手順 2: コンテナーを起動します。

      $ docker run -d busybox --name testlog top
    
  • 手順 3: コンテナーログを確認します。

      $ docker logs 7d6ac83a89a0
      2019-02-04T19:48:15.423Z [INFO]  core: marked as sealed                                          	
      2019-02-04T19:48:15.423Z [INFO]  core: pre-seal teardown starting                                                                                                 	
      2019-02-04T19:48:15.423Z [INFO]  core: stopping cluster listeners                                                                                             	
      2019-02-04T19:48:15.423Z [INFO]  core: shutting down forwarding rpc listeners                                                                                 	
      2019-02-04T19:48:15.423Z [INFO]  core: forwarding rpc listeners stopped
      2019-02-04T19:48:15.599Z [INFO]  core: rpc listeners successfully shut down
      2019-02-04T19:48:15.599Z [INFO]  core: cluster listeners successfully shut down	
    

メモ

デュアルログ機能を有効にする前後において、ログ読み込みに対応するlocaljson-filejournaldといったローカルドライバーの機能は何も変わりません。 そのドライバーにおいてローカルのログは、上のどちらのケースにおいても参照可能です。

Configuration options

The “dual logging” cache accepts the same configuration options as the local logging driver, but with a cache- prefix. These options can be specified per container, and defaults for new containers can be set using the daemon configuration file.

By default, the cache has log-file rotation enabled, and is limited to a maximum of 5 files of 20MB each (before compression) per container. Use the configuration options described below to customize these defaults.

Option Default Description
cache-disabled "false" Disable local caching. Boolean value passed as a string (true, 1, 0, or false).
cache-max-size "20m" The maximum size of the cache before it is rotated. A positive integer plus a modifier representing the unit of measure (k, m, or g).
cache-max-file "5" The maximum number of cache files that can be present. If rotating the logs creates excess files, the oldest file is removed. A positive integer.
cache-compress "true" Enable or disable compression of rotated log files. Boolean value passed as a string (true, 1, 0, or false).

Disable the dual logging cache

Use the cache-disabled option to disable the dual logging cache. Disabling the cache can be useful to save storage space in situations where logs are only read through a remote logging system, and if there is no need to read logs through docker logs for debugging purposes.

Caching can be disabled for individual containers or by default for new containers, when using the daemon configuration file.

The following example uses the daemon configuration file to use the “splunk’ logging driver as a default, with caching disabled:

$ cat /etc/docker/daemon.json
{
  "log-driver": "splunk",
  "log-opts": {
    "cache-disabled": "true",
    ... (options for "splunk" logging driver)
  }
}

Note

For logging drivers that support reading logs, such as the local, json-file and journald drivers, dual logging is not used, and disabling the option has no effect.

制限事項

  • コンテナーにおいて利用するログドライバーやプラグインが、リモートに向けてログ送信を行うものである場合、突然「ネットワーク的な」問題や、ローカルキャッシュへの書き込み不能となる事態が発生する場合があります。
  • logdriverへの書き込みが何らかの理由(ファイルシステムがいっぱい、書き込み権限消失)により失敗した場合、キャッシュの書き込みが失敗し、このことはデーモンのログに記録されます。 キャッシュへのログエントリーは、リトライされることはありません。ed.
  • デフォルトの設定のままでは、ログがキャッシュから失われる場合があります。 低速なファイル書き込みなどの際に、コンテナーの標準入出力からの情報をブロックしないように、リングバッファーが利用されるからです。 管理者はデーモンがシャットダウンする前に、この状況を修復する必要があります。
docker, logging, driver