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 で扱われる事が確認できます。