コンテナ Agent を使用してホストからログを追跡する

Datadog では、コンテナ・ログの収集に STDOUT/STDERR を使用することを推奨しています。

概要

ポッド/コンテナは、デフォルトでホストファイルにアクセスできませんが、これは Agent にも適用されます。ホストファイルからログを収集するようにコンテナ Agent を構成しようとすると、以下のようなエラーメッセージが表示されます。

  syslog
  ------
    Type: file
    Path: /var/log/messages
    Status: Error: file /var/log/messages does not exist

コンテナ Agent がホストファイルにアクセスできるようにするには、ファイルまたはそのディレクトリをコンテナ Agent にマウントします。OS に基づいてどのホストファイルとディレクトリをマウントするかは、Agent コンフィグレーションファイルとディレクトリのリストを参照してください。

ここでは、Kubernetes と Docker の例を紹介します。

ホストのログファイルを Agent コンテナにマウントするには、Agent マニフェストのボリュームセクションにホストログディレクトリを、volumeMounts セクションにコンテナログディレクトリを設定します。

        volumeMounts:
          - name: customlogs
            ## Agent コンテナ内の希望するログディレクトリ:
            mountPath: /container/var/test-dir/logs/

      volumes:
        - name: customlogs
          hostPath:
            ## ログファイルを含むホスト内のディレクトリ。
            path: /var/test-dir/logs/

次に、ログ収集のためにファイルを追跡するように Agent を構成します。これを行うには、カスタムログ構成を /conf.d/ にマウントします。ファイル名は、拡張子が .yaml であれば何でも構いません。

ホストファイルを直接マウントするよりも、ConfigMap を使用して構成を保存することが望ましいです。以下は、logs.yaml ファイルを持つ ConfigMap マニフェストのサンプルです。

kind: ConfigMap
apiVersion: v1
metadata:
     name: ddagent-logs-configmap
     namespace: default
data:
     logs.yaml: |-
           logs:
             - type: file
               service: syslog
               source: os
               ## Agent マニフェストで設定したコンテナログディレクトリを使用する
               path: /container/var/test-dir/logs/*.log

コマンドで ConfigMap オブジェクトを作成します。

kubectl create -f <configmap manifest>

そして、/conf.d/ の下にマウントします。

        volumeMounts:
          - name: cm-logs
            mountPath: /conf.d/

      volumes:
        - name: cm-logs
          configMap:
            name: ddagent-logs-configmap

ホストログファイルをマウントするには、Agent の docker run コマンドにボリュームパラメーターを追加します。

-v /<host log directory>/:<container log directory>/

そして、ローカルでカスタムログの構成を作成します。

logs:
  - type: file
    service: syslog
    source: os
    path: <container log path>/*.log

次に、それを /conf.d/ にマウントします。ファイル名は何でも構いません。

-v <absolute path>/logs.yaml:/conf.d/logs.yaml

Agent の Docker インストールコマンドは、以下のようになります。

docker run -d --name datadog-agent \
           --cgroupns host \
           --pid host \
           -e DD_API_KEY=<DATADOG_API_KEY> \
           -e DD_LOGS_ENABLED=true \
           -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 \
           -v /<host log directory>/:<container log directory>/ \
           -v /<config location>/logs.yaml:/conf.d/logs.yaml \
           gcr.io/datadoghq/agent:latest

検証

ここまで設定したら、Agent をデプロイします。docker exec -it datadog-agent agent status を実行すると、以下のような画面が表示されるはずです。

==========
Logs Agent
==========

    Sending compressed logs in HTTPS to agent-http-intake.logs.datadoghq.com on port 443
    BytesSent: 10605
    EncodedBytesSent: 2144
    LogsProcessed: 32
    LogsSent: 31

  logs
  ----
    Type: file
    Path: /container/var/test-dir/logs/*.log
    Status: OK
      1 files tailed out of 1 files matching
    Inputs: /container/var/test-dir/logs/722bfb2cb35cc627-json.log