Docker ログの収集
セキュリティモニタリングが使用可能です セキュリティモニタリングが使用可能です

Docker ログの収集

概要

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

  • Agent が Docker 環境の外部にあるホスト
  • コンテナ化された Agent の Docker 環境へのデプロイ

次に、環境コンテナからすべてのログを収集することも、コンテナイメージ名またはコンテナラベルで絞り込んで、収集するログを選別することもできます。本ドキュメントでは、実行中のすべてのコンテナからログを収集する方法と共に、オートディスカバリーを活用しログインテグレーションを有効にする方法を紹介します。

ワンステップインストレーション

まず最初に、Agent(コンテナバージョンおよび直接ホストバージョンともに) のインストレーションと、すべてのコンテナのログ収集を有効にします。

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_CONTAINER_EXCLUDE="name:datadog-agent" \
           -v /var/run/docker.sock:/var/run/docker.sock: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 \
           datadog/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_CONTAINER_EXCLUDE="name:datadog-agent" \
           -v \\.\pipe\docker_engine:\\.\pipe\docker_engine \
           datadog/agent:latest

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

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

コマンド説明
-e DD_LOGS_ENABLED=truetrue に設定すると、ログ収集が有効になります。Agent は構成ファイルのログ命令を探します。
-e DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=trueすべてのコンテナのログ収集を有効にするログコンフィギュレーションを追加します。
-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 ソケットの stdout/stderr コンテナから収集されます。

ホストに最新版の Agent 6 をインストールします。Agent は ホスト上のファイル または stdout/stderr コンテナからログを収集できます。

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

logs_enabled: true
listeners:
    - name: docker
config_providers:
    - name: docker
      polling: true
logs_config:
    container_collect_all: true

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

重要:

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

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

  • Docker のデフォルトである json-file ログドライバーではなく journald ログドライバーを使用する場合は、コンテナ環境の設定に関するドキュメント journald インテグレーション をご覧ください。

ログインテグレーション

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])"}]}]'

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

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

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

高度なログの収集

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

コンテナを絞り込む

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

存続期間が短いコンテナ

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

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

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

その他の参考資料