vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

Datadog Nginx error.log の timestamp を考慮する

Datadog の Nginx Integration を利用してログを収集した際に error.log が UTC で取り込まれるため対処します。



前提

  • 収集対象のサーバの timezone は JST
  • 収集設定はデフォルト

      logs:
        - type: file
          path: /var/log/nginx/access.log
          service: nginx
          source: nginx
    
        - type: file
          path: /var/log/nginx/error.log
          service: nginx
          source: nginx
    
  • source: nginx を指定しているため Datadog 提供のパイプライン経由となる

  • Datadog UI 上の Time zone は JST (Detect by browser (UTC+09:00))

事象

OK: access.log は JST で取り込まれる

access.log の出力形式は dd/MMM/yyyy:HH:mm:ss Z となっており、タイムゾーン指定があります。

この場合は特に問題は有りません。

NG: error.log が UTC で取り込まれる

error.log の出力形式は yyyy/MM/dd HH:mm:ss となっており、タイムゾーン指定がありません。

タイムゾーン未指定のため Datadog は UTC として取り込みます。

結果、実際のログ出力日時(JST)に更に +09:00 した日時での扱いとなります。

Live Tail で取り込まれているのは確認できるが、未来日なので Search で表示できないという事が起こります。 (9時間後に見れるようになります)

対処

対処方法としては二通りになると思います。

  • a) ログ出力にタイムゾーンを含める
  • b) Datadog Logs Pipeline で処理する

今回の Nginx では error.log の書式変更に対応していませんので、 a) の手法は取れません。

そのため Pipeline で処理します。

Nginx Integration pipeline (確認)

デフォルトで用意されている Integration pipeline は変更不可です。有効・無効と複製(Clone)は可能です。

タイムスタンプ周りでどのような処理が行われているのか確認します。

(1) Grok Parser: Parsing Nginx logs

タイムスタンプを data_access 属性に割り当てています。

error.format %{date("yyyy/MM/dd HH:mm:ss"):date_access} \[%{word:level}\] %{data:error.message}(, %{data::keyvalue(": ",",")})?

(6) Date Remapper: Define `date_access` as the official date of the log

date_access 属性をログタイムスタンプとして定義しています。

新規 Pipeline の追加

Integration pipeline を clone して編集する事もできますが、Datadog側仕様変更等で更新される可能性があるかもしれないため、新たに Pipeline を追加します。

Processor は Integration pipeline の processor 内容を模しており、 タイムスタンプ関連の processor のみに絞り、変更箇所は date matcher に timezone を追加しているのみです。

  • (filter) 条件に error.log を追加し、 nginx の error.log のみを対象としています
  • (1) Grok Parser で timezone を明示指定("Asia/Tokyo" 部分)したタイムスタンプに変換し、data_access 属性に割り当てます。

      error.format %{date("yyyy/MM/dd HH:mm:ss", "Asia/Tokyo"):date_access} \[%{word:level}\] %{data:error.message}(, %{data::keyvalue(": ",",")})?
    
  • (2) Date Remapper で date_access 属性をログタイムスタンプとして定義します

結果

error.log についても access.log 同様、JST で扱われる事が確認できます。

まとめ

  • Datadog Logs はログのタイムスタンプ形式にタイムゾーン指定が無い場合、 UTC で取り込まれます
  • source: 指定により事前定義された Integration Pipeline を経由します
  • Logs Pipeline で処理する場合は、 Grok の date matcher でタイムゾーンを指定して解析し、Log date remapper でタイムスタンプを定義することでタイムゾーン指定が行なえます