Docker ログの収集

Docker ログの収集

概要

Datadog Agent 6 以降は、コンテナからログを収集します。2 通りのインストレーション方法があります。

ログ収集の構成は、現在の環境によって異なります。開始するには、次のいずれかのインストールを選択してください。

インストール

Datadog Agent を埋め込みホストを監視する Docker コンテナ を実行するには、次のコマンドを使用します。

docker run -d --name datadog-agent \
           -e DD_API_KEY=<DATADOG_API_KEY> \
           -e DD_LOGS_ENABLED=true \
           -e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true \
           -e DD_LOGS_CONFIG_DOCKER_CONTAINER_USE_FILE=true \
           -e DD_CONTAINER_EXCLUDE="name:datadog-agent" \
           -v /var/run/docker.sock:/var/run/docker.sock:ro \
           -v /var/lib/docker/containers:/var/lib/docker/containers:ro \
           -v /proc/:/host/proc/:ro \
           -v /opt/datadog-agent/run:/opt/datadog-agent/run:rw \
           -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
           gcr.io/datadoghq/agent:latest

: Windows システムでは、このコマンドをボリュームマウントなしで実行します。つまり以下のようになります。

docker run -d --name datadog-agent \
           -e DD_API_KEY=<DATADOG_API_KEY> \
           -e DD_LOGS_ENABLED=true \
           -e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true \
           -e DD_LOGS_CONFIG_DOCKER_CONTAINER_USE_FILE=true \
           -e DD_CONTAINER_EXCLUDE="name:datadog-agent" \
           -v \\.\pipe\docker_engine:\\.\pipe\docker_engine \
           -v c:\programdata\docker\containers:c:\programdata\docker\containers:ro
           gcr.io/datadoghq/agent:latest

最新版の Datadog Agent の使用が推奨されます。GCR で利用できる Agent v6 のイメージリストを参照してください。

ログ収集に関連するコマンド:

-e DD_LOGS_ENABLED=true
true に設定すると、ログ収集が有効になります。これで、Agent はコンフィギュレーションファイルにあるログインストラクションを探します。
-e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true
すべてのコンテナに対してログ収集を有効化するログコンフィギュレーションを追加します。
-e DD_LOGS_CONFIG_DOCKER_CONTAINER_USE_FILE=true
ファイルからの Docker コンテナログ収集を有効化するログコンフィギュレーションを追加します。Datadog Agent 7.27.0/6.27.0 以降で利用可能です。詳しくは詳細セクションを参照してください。
-v /opt/datadog-agent/run:/opt/datadog-agent/run:rw
再起動中またはネットワーク障害発生時のコンテナログの紛失を回避します。このディレクトリで各コンテナについて収集されたログの最終行がホスト上に保存されます。
-e DD_CONTAINER_EXCLUDE="name:datadog-agent"
Datadog Agent がそれ自身のログとメトリクスを収集および送信することを回避します。Datadog Agent のログまたはメトリクスを収集する場合はこのパラメーターを削除してください。このパラメーター値は正規表現をサポートしています。
-v /var/run/docker.sock:/var/run/docker.sock:ro
Docker daemon に接続してコンテナを探し、Docker ソケットから stdout/stderr を収集します。
-v /var/lib/docker/containers:/var/lib/docker/containers:ro
ファイルからコンテナログを収集します。Datadog Agent 6.27.0/7.27.0 以降で利用可能です。
  1. 最新バージョンの Agent をホストにインストールします。

  2. デフォルトの状態では、Datadog Agent でのログ収集は 無効 になっています。有効にするには、datadog.yaml 構成ファイルに次の行を加えます。

    logs_enabled: true
    listeners:
        - name: docker
    config_providers:
        - name: docker
          polling: true
    logs_config:
        container_collect_all: true
    
  3. Windows 10 のみ: Docker コンテナ作業のアクセス許可を得るには、Datadog Agent ユーザーが docker-users グループのメンバーである必要があります。管理者コマンドプロンプトから net localgroup docker-users "ddagentuser" /ADD を実行するか、Docker ユーザーグループのコンフィギュレーション手順に従ってください。

  4. Agent を再起動して、Datadog ですべてのコンテナログを確認します。

  1. 最新バージョンの Agent をホストにインストールします。

  2. カスタムログ収集のドキュメントに従って、ログのファイルを調整します。

    <PATH_LOG_FILE>/<LOG_FILE_NAME>.log に保存されているログを <APP_NAME> アプリケーションから収集するには、Agent のコンフィギュレーションディレクトリのルートに以下の内容の <APP_NAME>.d/conf.yaml ファイルを作成します。

    logs:
      - type: file
        path: "<PATH_LOG_FILE>/<LOG_FILE_NAME>.log"
        service: "<APP_NAME>"
        source: "<SOURCE>"
    
  3. Agent を再起動し、Datadog のすべてのコンテナログを確認します。

重要:

  • コンテナメタデータはカスタムログ収集では取得されないため、Agent はコンテナタグをログに自動的に割り当てません。カスタムタグを使用してコンテナタグを作成します。

  • Datadog Agent 6.8 以降では、sourceservice の初期値は short_image タグの値となります。下で説明するように、ソースやサービスの値はオートディスカバリーで上書きすることができます。source 値をインテグレーション名に設定すると、ログをパースして関連情報を抽出するインテグレーション Pipelines がインストールされます。

  • コンテナ Stderr からのログは Error の状態がデフォルトとなります。

  • Docker のデフォルトである json-file ログドライバーではなく journald ログドライバーを使用する場合は、コンテナ環境の設定に関するドキュメント journald インテグレーションをご覧ください。フィルタリング対象のパラメーターについての詳細は、journald フィルターユニットのドキュメントを参照してください。

ファイルからの Docker コンテナログ収集

Datadog Agent 7.27.0/6.27.0 以降では、Docker コンテナログをファイルから収集することができます。ファイルからの Docker コンテナログ収集は Docker ソケットを介した収集に代わる手段で、より良いパフォーマンスが得られるほか、Docker コンテナログを保存するディレクトリが以下の場所で Agent に公開されてからすぐに使用することができます: /var/lib/docker/containers (c:\programdata\docker\containers on Windows)

重要:

  • Docker ソケットコンテナでのログ収集からファイルベースのログ収集に移行する場合、新しいコンテナのみがファイルから読み取られます。必要に応じて環境変数 DD_LOGS_CONFIG_DOCKER_CONTAINER_FORCE_USE_FILEtrue に設定し、ファイルからすべてのコンテナログを抽出するよう Agent に強制することができます。この場合、すでにログの一部が収集されたコンテナについてはログの重複が発生することがあります。

  • Agent をコンテナファイルでのログ収集から Docker ソケットを介した収集に戻す場合も、既存のコンテナについてのログが重複する可能性があります。

ログインテグレーション

Datadog Agent 6.8 以降では、sourceservice の初期値は short_image タグの値となります。これにより、Datadog は各コンテナのログソースを特定でき、対応するインテグレーションを自動的にインストールできます。

コンテナのショートイメージ名とカスタムイメージのインテグレーション名が一致しない場合があります。アプリケーションにふさわしい名前に上書きするには、Datadog オートディスカバリーKubernetes ポッドアノテーションまたはコンテナラベルを使います。

オートディスカバリーは、ファイルの種類に応じてラベルが以下の形式となることを前提とします。

Dockerfile に以下のLABEL を追加します:

LABEL "com.datadoghq.ad.logs"='[<ログコンフィギュレーション>]'

docker-compose.yaml ファイルに以下のラベルを追加します:

labels:
    com.datadoghq.ad.logs: '["<LOGS_CONFIG>"]'

実行コマンドとして次のラベルを追加します:

-l com.datadoghq.ad.logs='[<ログコンフィギュレーション>]'

<LOG_CONFIG> がログ収集コンフィギュレーションの場合、インテグレーション構成ファイルにあります。詳細は、ログ収集コンフィギュレーションを参照してください

: Datadog では、Dockerラベルを使い service 値を設定する際のベストプラクティスとして、統合サービスタグ付けの使用をお勧めしています。統合サービスタグ付けは envserviceversion の 3 つの標準タグを使用して、ログを含むすべての Datadog テレメトリーと結合します。ご使用環境で統合タグ付けを構成する方法に関する詳細は、統合サービスタグ付けドキュメントをご参照ください。

次の Dockerfile は対応するコンテナにおける NGINX ログインテグレーションを有効にします (service の値は変更できます):

LABEL "com.datadoghq.ad.logs"='[{"source": "nginx", "service": "webapp"}]'

メトリクスとログ、両 NGINX インテグレーションを有効にする方法

LABEL "com.datadoghq.ad.check_names"='["nginx"]'
LABEL "com.datadoghq.ad.init_configs"='[{}]'
LABEL "com.datadoghq.ad.instances"='[{"nginx_status_url": "http://%%host%%:%%port%%/nginx_status"}]'
LABEL "com.datadoghq.ad.logs"='[{"source": "nginx", "service": "webapp"}]'

スタックトレースのような複数行のログのため、Agent には複数の行を 1 行に集約する複数行の処理規則があります。

ログの一例 (Java スタックトレース):

2018-01-03T09:24:24.983Z UTC Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

下にあるように、コンテナで com.datadoghq.ad.logs ラベルを使い、上記のログが正確に収集されているかを確かめます。

labels:
    com.datadoghq.ad.logs: '[{"source": "java", "service": "myapp", "log_processing_rules": [{"type": "multi_line", "name": "log_start_with_date", "pattern" : "\\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])"}]}]'

複数行の処理規則には、他にもさまざまなパターンが記載されています。

Agent v7.25.0 以降/6.25.0 以降では、コンテナのオートディスカバリーラベルに基づくファイルから直接ログを収集できます。このようなログを収集するには、以下のようにコンテナに com.datadoghq.ad.logs ラベルを使用して /logs/app/prod.log を収集します。

labels:
    com.datadoghq.ad.logs: '[{"type":"file", "source": "sample_app", "service": "sample_service", "path": "/logs/app/prod.log"}]'

ファイルから収集されたログは、コンテナのメタデータとともにタグ付けされます。ログ収集はコンテナのライフサイクルにリンクされ、コンテナが停止するとそのファイルからのログ収集も停止します。

:

  • ファイルパスは Agent に相対的であるため、ファイルを含むディレクトリは、アプリケーションを実行しているコンテナと Agent コンテナの間で共有される必要があります。たとえば、コンテナが /logs をマウントする場合、ファイルにログを作成する各コンテナはログファイルが書き込まれる場所に /logs/app のようなボリュームをマウントすることがあります。

  • このようなラベルをコンテナに使用する場合、その stderr/stdout ログは自動的に収集されません。stderr/stdout およびファイルの両方から収集する必要がある場合は、ラベルを使用して明示的に有効にします。たとえば、

labels:
    com.datadoghq.ad.logs: '[{"type":"file", "source": "java", "service": "app", "path": "/logs/app/prod.log"}, {"type": "docker", "source": "app_container", "service": "app"}]'
  • このような組み合わせを使用しているとき、sourceservice にデフォルト値はなく、オートディスカバリーのラベルで明示的に設定する必要があります。

: オートディスカバリー機能は、DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL 環境変数の有無にかかわらず使用できます。次のオプションの中から 1 つを選択してください。

  • コンテナラベルまたはポッドアノテーションを使い、ログを収集するコンテナを選択します。
  • 環境変数を使いすべてのコンテナからログを集め、デフォルトの source 値と service 値を上書きします。
  • 必要とする一部のコンテナの処理規則を追加します。

高度なログの収集

オートディスカバリーログラベルを使用し、高度なログ収集の処理ロジックを適用します。たとえば、

コンテナを絞り込む

ログの収集元となるコンテナを管理することができます。これは、たとえば Datadog Agent のログを収集しないようにするのに役立ちます。詳細についてはコンテナのディスカバリー管理を参照してください。

存続期間が短いコンテナ

Docker 環境では、Agent は Docker イベントによりコンテナのアップデートをリアルタイムに受け取ります。Agent は 1 秒ごとにコンテナラベル(オートディスカバリー)からコンフィギュレーションを抽出しアップデートします。

Agent v6.14 以降、Agent はすべてのコンテナ(実行中かは問わず)のログを収集します。つまり、直近の 1 秒間に開始し停止した存続期間の短いコンテナのログは、削除されるまで収集されます。

Kubernetes 環境には、Kubernetes 存続期間が短いコンテナのドキュメントを参照してください。

その他の参考資料