概要

Datadog Agent 6+ は、コンテナからログを収集します。ECS コンテナからログを収集する推奨方法は、Agent のタスク定義内でログ収集を有効にすることです。これは、以前使用していたタスク定義ファイルを修正し、更新したタスク定義を登録することで実行できます。また、Amazon Web UI から直接タスク定義を編集することもできます。

有効化すると、Datadog Agent コンテナは、自身と同じホスト上の他のアプリケーションコンテナから発行されるログを収集します。これは、default または json-file ロギングドライバーを使用しているときに stdoutstderr ログストリームに出力されるログに限定されます。

AWS Fargate

AWS Fargate のログ収集をセットアップするには、AWS Fargate ログ収集を参照してください。

インストール

ECS タスク定義

実行中の ECS コンテナからすべてのログを収集するには、オリジナルの ECS セットアップの Agent のタスク定義を、以下の環境変数とマウントで更新します。

必要な基本構成は、datadog-agent-ecs-logs.json を参考にします。タスク定義には、以下のものが必要です。

{
  "containerDefinitions": [
    {
      (...)
      "mountPoints": [
        (...)
        {
          "containerPath": "/opt/datadog-agent/run",
          "sourceVolume": "pointdir",
          "readOnly": false
        },
        {
          "containerPath": "/var/lib/docker/containers",
          "sourceVolume": "containers_root",
          "readOnly": true
        }
      ],
      "environment": [
        (...)
        {
          "name": "DD_LOGS_ENABLED",
          "value": "true"
        },
        {
          "name": "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL",
          "value": "true"
        }
      ]
    }
  ],
  "volumes": [
    (...)
    {
      "host": {
        "sourcePath": "/opt/datadog-agent/run"
      },
      "name": "pointdir"
    },
    {
      "host": {
        "sourcePath": "/var/lib/docker/containers/"
      },
      "name": "containers_root"
    }
  ],
  "family": "datadog-agent-task"
}

必要な基本構成は、datadog-agent-ecs-win-logs.json を参考にします。タスク定義には、以下のものが必要です。

{
  "containerDefinitions": [
    {
      (...)
      "mountPoints": [
        (...)
        {
          "containerPath": "C:/programdata/datadog/run",
          "sourceVolume": "pointdir",
          "readOnly": false
        },
        {
          "containerPath": "c:/programdata/docker/containers",
          "sourceVolume": "containers_root",
          "readOnly": true
        }
      ],
      "environment": [
        (...)
        {
          "name": "DD_LOGS_ENABLED",
          "value": "true"
        },
        {
          "name": "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL",
          "value": "true"
        }
      ]
    }
  ],
  "volumes": [
    (...)
    {
      "name": "pointdir",
      "dockerVolumeConfiguration": {
        "autoprovision": true,
        "scope": "shared",
        "driver": "local"
      }
    },
    {
      "host": {
        "sourcePath": "c:/programdata/docker/containers"
      },
      "name": "containers_root"
    }
  ],
  "family": "datadog-agent-task"
}

これらのタスク定義では、環境変数 DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true を設定して、Agent が検出したすべてのコンテナからログを収集します。この環境変数を false に設定すると、コンテナにオートディスカバリーラベルが存在する場合にのみログを収集するように設定されます。

Agent のタスク定義のローカルファイルを所有している場合、更新されたタスク定義の登録の手順を繰り返すことができます。これにより、新しいリビジョンが作成されます。Datadog Agent の Daemon Service で、この更新されたリビジョンを参照することができます。

カスタムログ収集

オートディスカバリーラベル

環境変数 DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL=true が設定されている場合、Agent はデフォルトで検出したすべてのコンテナからログを収集します。これらの収集されたログには、service タグと source タグにそれぞれのコンテナのショートイメージ名が設定されています。オートディスカバリー用の ECS アプリケーションコンテナで Docker Labels を提供することで、Agent がそのコンテナに対して使用するログ構成をカスタマイズすることができます。

オートディスカバリー構成の使用方法については、Docker Log Collection セットアップ手順を参照してください。例えば、以下のログ構成では、収集するログの sourceservice をオーバーライドしています。

[{"source": "example-source", "service": "example-service"}]

ECS に関しては、ログを出力するアプリケーションコンテナのタスク定義の dockerLabels 内にあるラベル com.datadoghq.ad.logs に追加することができます。

{
  "containerDefinitions": [
    {
      "name": "<CONTAINER_NAME>",
      "image": "<CONTAINER_IMAGE>",
      "dockerLabels": {
        "com.datadoghq.ad.logs": "[{\"source\": \"example-source\", \"service\": \"example-service\"}]"
      }
    }
  ]
}

ログ構成にタグを追加する、または任意の log_processing_rules による高度なログ収集オプションでさらにカスタマイズすることができます。

コンテナ内のログファイル

Docker (default または json-file ドライバー) は stdoutstderr ログストリームを Agent がすぐに見つけられるフォーマットで公開します。しかし、コンテナがコンテナ内で孤立したログファイルを作成している場合、Agent はそのファイルに対してネイティブに可視性を持ちません。Datadog は、コンテナ化されたアプリケーションで stdoutstderr 出力ストリームを使用して、ログ収集をより自動的にセットアップすることを推奨します。これが不可能な場合、オートディスカバリーログ構成を提供して目的のファイルパスを指定し、Agent コンテナとアプリケーションコンテナがログファイルを含むホスト上のディレクトリを共有するようにすることができます。

以下のログ構成は、Agent に対して、/var/log/example/app.log パスにこのカスタムログファイルを収集することを指示します。

[{
  "type": "file",
  "path": "/var/log/example/app.log",
  "source": "example-source",
  "service": "example-service"
}]

例: 以下のタスク定義では、以下のことを実行します。

  • ファイル /var/log/example/app.log にいくつかのログを書き込む
  • ログの構成を設定するための dockerLabels を存在させる
  • この /var/log/example ディレクトリに対してホストパス volumesmountPoints を指定する
{
  "containerDefinitions": [
    {
      "name": "example-logger",
      "image": "busybox",
      "entryPoint": ["/bin/sh", "-c", "--"],
      "command": ["while true; do sleep 1; echo `date` example file log >> /var/log/example/app.log; done;"],
      "mountPoints": [
        {
          "containerPath": "/var/log/example",
          "sourceVolume": "applogs"
        }
      ],
      "dockerLabels": {
        "com.datadoghq.ad.logs": "[{\"type\":\"file\",\"path\":\"/var/log/example/app.log\",\"source\":\"example-source\",\"service\":\"example-service\"}]"
      }
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/var/log/example"
      },
      "name": "applogs"
    }
  ],
  "family": "example-logger"
}

構成のファイルパスは、常に Agent からの相対パスです。同じ volumemountPoint が Agent のタスク定義内に存在し、そのログファイルを可視化する必要があります。

ECS によるボリューム管理の詳細については、AWS Bind マウントのドキュメントを参照してください。

: コンテナでこのような構成を使用する場合、stdoutstderr のログストリームはコンテナから自動的に収集されず、ファイルのみ収集されます。コンテナのストリームとファイルの両方から収集する必要がある場合は、構成で明示的にこれを有効にします。例:

[
  {
    "type": "file",
    "path": "/var/log/example/app.log",
    "source": "example-file",
    "service": "example-service"
  },
  {
    "source": "example-stream",
    "service": "example-service"
  }
]

ログのインテグレーションを有効にする

各コンテナに使用するインテグレーションを特定するには、source 属性を使用します。この属性をコンテナのラベルで直接上書きすれば、Datadog ログのインテグレーションが有効になります。このプロセスの詳細については、Datadog のログのオートディスカバリー ガイドを参照してください。

参考資料