ログの収集
Dash が新機能を発表!インシデントマネジメント、Continuous Profiler など多数の機能が追加されました! Dash イベントで発表された新機能!

ログの収集

特定のログ収集構成にログ処理ルールを適用することで、以下が可能です。

: 複数の処理ルールを設定した場合、ルールは順次適用され、各ルールは直前のルールの結果に適用されます。

Datadog Agent によって収集されたすべてのログに同一の処理ルールを適用する場合は、グローバルな処理ルールのセクションを参照してください。

ログの絞り込み

ログの一部分のみを Datadog に送信するには、構成ファイル内の log_processing_rules パラメーターを使用して、typeexclude_at_match または include_at_match を指定します。

exclude_at_match

パラメーター説明
exclude_at_match指定されたパターンがメッセージに含まれる場合、そのログは除外され、Datadog に送信されません。

たとえば、Datadog メールアドレスを含むログを除外するには、次の log_processing_rules を使用します。

logs:
  - type: file
    path: /my/test/file.log
    service: cardpayment
    source: java
    log_processing_rules:
    - type: exclude_at_match
      name: exclude_datadoghq_users
      ## 任意の正規表現
      pattern: \w+@datadoghq.com

Docker 環境では、コンテナで com.datadoghq.ad.logs ラベルを使用して log_processing_rules を指定します。以下に例を示します。

 labels:
    com.datadoghq.ad.logs: >-
      [{
        "source": "java",
        "service": "cardpayment",
        "log_processing_rules": [{
          "type": "exclude_at_match",
          "name": "exclude_datadoghq_users",
          "pattern" : "\\w+@datadoghq.com"
        }]
      }]

: ラベルを使用する場合、パターン内の正規表現文字はエスケープする必要があります。たとえば、\d\\d に、\w\\w にします。

Kubernetes 環境では、ポッドで ad.datadoghq.com ポッドアノテーションを使用して log_processing_rules を指定します。以下に例を示します。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: cardpayment
spec:
  selector:
    matchLabels:
      app: cardpayment
  template:
    metadata:
      annotations:
        ad.datadoghq.com/cardpayment.logs: >-
          [{
            "source": "java",
            "service": "cardpayment",
            "log_processing_rules": [{
              "type": "exclude_at_match",
              "name": "exclude_datadoghq_users",
              "pattern" : "\\w+@datadoghq.com"
            }]
          }]
      labels:
        app: cardpayment
      name: cardpayment
    spec:
      containers:
        - name: cardpayment
          image: cardpayment:latest

: ポッドアノテーションを使用する場合、パターン内の正規表現文字はエスケープする必要があります。たとえば、\d\\d に、\w\\w にします。

include_at_match

パラメーター説明
include_at_match指定されたパターンを含むメッセージを持つログだけが Datadog に送信されます。

たとえば、Datadog メールアドレスを含むログに絞り込むには、次の log_processing_rules を使用します。

logs:
  - type: file
    path: /my/test/file.log
    service: cardpayment
    source: java
    log_processing_rules:
    - type: include_at_match
      name: include_datadoghq_users
      ## 任意の正規表現
      pattern: \w+@datadoghq.com

Docker 環境では、コンテナで com.datadoghq.ad.logs ラベルを使用して log_processing_rules を指定します。以下に例を示します。

 labels:
    com.datadoghq.ad.logs: >-
      [{
        "source": "java",
        "service": "cardpayment",
        "log_processing_rules": [{
          "type": "include_at_match",
          "name": "include_datadoghq_users",
          "pattern" : "\\w+@datadoghq.com"
        }]
      }]

: ラベルを使用する場合、パターン内の正規表現文字はエスケープする必要があります。たとえば、\d\\d に、\w\\w にします。

Kubernetes 環境では、ポッドで ad.datadoghq.com ポッドアノテーションを使用して log_processing_rules を指定します。以下に例を示します。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: cardpayment
spec:
  selector:
    matchLabels:
      app: cardpayment
  template:
    metadata:
      annotations:
        ad.datadoghq.com/cardpayment.logs: >-
          [{
            "source": "java",
            "service": "cardpayment",
            "log_processing_rules": [{
              "type": "include_at_match",
              "name": "include_datadoghq_users",
              "pattern" : "\\w+@datadoghq.com"
            }]
          }]
      labels:
        app: cardpayment
      name: cardpayment
    spec:
      containers:
        - name: cardpayment
          image: cardpayment:latest

: ポッドアノテーションを使用する場合、パターン内の正規表現文字はエスケープする必要があります。たとえば、\d\\d に、\w\\w にします。

ログの機密データのスクラビング

編集が必要な機密データがログに含まれている場合は、機密要素をスクラビングするように Datadog Agent を構成します。それには、構成ファイルで log_processing_rules パラメーターを使用して、typemask_sequences を指定します。

これにより、一致したすべてのグループが replace_placeholder パラメーターの値に置換されます。

以下は、クレジットカード番号を編集する例です。

logs:
 - type: file
   path: /my/test/file.log
   service: cardpayment
   source: java
   log_processing_rules:
      - type: mask_sequences
        name: mask_credit_cards
        replace_placeholder: "[masked_credit_card]"
        ## キャプチャするグループを含む 1 つのパターン
        pattern: (?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})

Docker 環境では、コンテナで com.datadoghq.ad.logs ラベルを使用して log_processing_rules を指定します。以下に例を示します。

 labels:
    com.datadoghq.ad.logs: >-
      [{
        "source": "java",
        "service": "cardpayment",
        "log_processing_rules": [{
          "type": "mask_sequences",
          "name": "mask_credit_cards",
          "replace_placeholder": "[masked_credit_card]",
          "pattern" : "(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})"
        }]
      }]

: ラベルを使用する場合、パターン内の正規表現文字はエスケープする必要があります。たとえば、\d\\d に、\w\\w にします。

Kubernetes 環境では、ポッドで ad.datadoghq.com ポッドアノテーションを使用して log_processing_rules を指定します。以下に例を示します。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: cardpayment
spec:
  selector:
    matchLabels:
      app: cardpayment
  template:
    metadata:
      annotations:
        ad.datadoghq.com/cardpayment.logs: >-
          [{
            "source": "java",
            "service": "cardpayment",
            "log_processing_rules": [{
              "type": "mask_sequences",
              "name": "mask_credit_cards",
              "replace_placeholder": "[masked_credit_card]",
              "pattern" : "(?:4[0-9]{12}(?:[0-9]{3})?|[25][1-7][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11})"
            }]
          }]
      labels:
        app: cardpayment
      name: cardpayment
    spec:
      containers:
        - name: cardpayment
          image: cardpayment:latest

: ポッドアノテーションを使用する場合、パターン内の正規表現文字はエスケープする必要があります。たとえば、\d\\d に、\w\\w にします。

Agent バージョン 7.17 以降をご利用の場合、文字列 replace_placeholder はリファレンスを展開して $1$2 などのグループをキャプチャすることが可能です。キャプチャするグループとの間にスペースを入れずに文字列を続けるには、${<グループ番号>} のフォーマットを使用します。

たとえば、ログ User email: foo.bar@example.com からユーザー情報をスクラビングするには、以下を使用します。

  • pattern: "(User email: )[^@]*@(.*)"
  • replace_placeholder: "$1 masked_user@${2}"

これにより、次のログが Datadog に送信されます: User email: masked_user@example.com

複数行の集約

送信されるログが JSON 形式でない場合に、複数の行を 1 つのエントリに集約するには、1 行に 1 つのログを入れる代わりに、正規表現パターンを使用して新しいログを検出するように Datadog Agent を構成します。それには、構成ファイルで log_processing_rules パラメーターを使用して、typemulti_line を指定します。これで、指定されたパターンが再度検出されるまで、すべての行が 1 つのエントリに集約されます。

たとえば、Java のログ行は、どれも yyyy-dd-mm 形式のタイムスタンプで始まります。以下の行にはスタックトレースが含まれますが、これらは 2 つのログとして送信可能です。

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)
2018-01-03T09:26:24.365Z UTC starting upload of /my/file.gz

構成ファイルで上記のログ例を送信するには、次の log_processing_rules を使用します。

logs:
 - type: file
   path: /var/log/pg_log.log
   service: database
   source: postgresql
   log_processing_rules:
      - type: multi_line
        name: new_log_start_with_date
        pattern: \d{4}\-(0?[1-9]|1[012])\-(0?[1-9]|[12][0-9]|3[01])

Docker 環境では、コンテナで com.datadoghq.ad.logs ラベルを使用して log_processing_rules を指定します。以下に例を示します。

 labels:
    com.datadoghq.ad.logs: >-
      [{
        "source": "postgresql",
        "service": "database",
        "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])"
        }]
      }]

Kubernetes 環境では、ポッドで ad.datadoghq.com ポッドアノテーションを使用して log_processing_rules を指定します。以下に例を示します。

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: postgres
spec:
  selector:
    matchLabels:
      app: database
  template:
    metadata:
      annotations:
        ad.datadoghq.com/postgres.logs: >-
          [{
            "source": "postgresql",
            "service": "database",
            "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])"
            }]
          }]
      labels:
        app: database
      name: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:latest

: ポッドアノテーションを使用して複数行の集約を実行する場合、パターン内の正規表現文字はエスケープする必要があります。たとえば、\d\\d に、\w\\w にします。

その他の例:

文字列の例パターン
14:20:15\d{2}:\d{2}:\d{2}
11/10/2014\d{2}\/\d{2}\/\d{4}
Thu Jun 16 08:29:03 2016\w{3}\s+\w{3}\s+\d{2}\s\d{2}:\d{2}:\d{2}
20180228\d{8}
2020-10-27 05:10:49.657\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3}

: 複数行のログのための正規表現パターンは、常にログの先頭に一致します。行の途中でパターンを一致させることはできません。

一般的に使用されるログ処理ルール

例のリストを確認するには、専用のよく使用されるログ処理ルールに関する FAQ をご覧ください。

ワイルドカードを使用したディレクトリの追跡

ログファイルに日付のラベルが付いているか、すべてのログファイルが同じディレクトリに保存されている場合は、すべてのファイルを監視して、新しいファイルを自動的に検出するように Datadog Agent を構成できます。それには、path 属性にワイルドカードを使用します。選択した path と一致するファイルを除外する場合は、exclude_paths 属性にリストします。

  • path: /var/log/myapp/*.log を使用する場合

    • /var/log/myapp/ ディレクトリ内のすべての .log ファイルに一致します。
    • /var/log/myapp/myapp.conf には一致しません。
  • path: /var/log/myapp/*/*.log を使用する場合

    • /var/log/myapp/log/myfile.log に一致します。
    • /var/log/myapp/errorLog/myerrorfile.log に一致します。
    • /var/log/myapp/mylogfile.log には一致しません。

構成例:

logs:
 - type: file
   path: /var/log/myapp/*.log
   exclude_paths:
     - /var/log/myapp/debug.log
     - /var/log/myapp/trace.log
   service: mywebapp
   source: go

上の例は /var/log/myapp/log/myfile.log と一致しますが /var/log/myapp/log/debug.log/var/log/myapp/log/trace.log が追尾されることはありません。

: Agent がディレクトリ内にあるファイルをリストするには、そのディレクトリへの読み取りおよび実行アクセス許可が必要です。

UTF-16 形式のログをエンコード

Datadog Agent v6.23/v7.23 以降でアプリケーションログが UTF-16 形式で記述されている場合は、これらのログをエンコードしてログエクスプローラーで望ましい形にパースすることができます。ログコンフィギュレーションのセクションで encoding パラメーターを使用して、UTF16 リトルエンディアン の場合は utf-16-le に、UTF16 ビッグエンディアンの場合は utf-16-be に設定します。その他の値は無視され、Agent はファイルを UTF-8 形式で読み込みます。

構成例:

logs:
 - type: file
   path: /test/log/hello-world.log
   tags: key:value
   service: utf-16-logs
   source: mysql
   encoding: utf-16-be

: encoding パラメーターは type パラメーターが file に設定されている場合のみ適用可能です。

グローバルな処理ルール

Datadog Agent v6.10 以上では、exclude_at_matchinclude_at_matchmask_sequences の各処理ルールを、Agent のメイン構成ファイルで、または環境変数を使用してグローバルに定義できます。

datadog.yaml ファイルで、以下のようにします。

logs_config:
  processing_rules:
     - type: exclude_at_match
       name: exclude_healthcheck
       pattern: healthcheck
     - type: mask_sequences
       name: mask_user_email
       pattern: \w+@datadoghq.com
       replace_placeholder: "MASKED_EMAIL"

グローバルな処理ルールを構成するには、環境変数 DD_LOGS_CONFIG_PROCESSING_RULES を使用します。以下に例を示します。

DD_LOGS_CONFIG_PROCESSING_RULES='[{"type": "mask_sequences", "name": "mask_user_email", "replace_placeholder": "MASKED_EMAIL", "pattern" : "\\w+@datadoghq.com"}]'

Helm チャートで env パラメーターを使用して DD_LOGS_CONFIG_PROCESSING_RULES 環境変数を設定して、グローバルな処理ルールを構成します。以下に例を示します。

env:
  - name: DD_LOGS_CONFIG_PROCESSING_RULES
    value: '[{"type": "mask_sequences", "name": "mask_user_email", "replace_placeholder": "MASKED_EMAIL", "pattern" : "\\w+@datadoghq.com"}]'
Datadog Agent によって収集されるすべてのログが、グローバルな処理ルールの影響を受けます。

: グローバルな処理ルールに形式上の問題がある場合、Datadog Agent はログコレクターを起動しません。問題をトラブルシューティングするには、Agent の status サブコマンドを実行します。

その他の参考資料


*Logging without Limits は Datadog, Inc. の商標です。