2
2

More than 3 years have passed since last update.

脱Excel Elastic Stack(docker-compose)でcsvログを分析・可視化 - multilineの中の"年/月/日,時:分:秒"をgrokフィルタでパースし、日本時間として扱う

Last updated at Posted at 2020-10-31

はじめに

どうも!生産技術部で製品の検査工程を担当しているエンジニアです。脱Excel Elastic Stack(docker-compose)でcsvログを分析・可視化 - Elastic Stackとはの続きになります。

対象読者

この記事では、Elastic Stackをそもそも知らない方、これから試そうと思っている方を対象としています。

この記事の内容

  • このように年/月/日の順で並んでスラッシュ区切りの日付は、標準のgrokフィルタでパースすることはできません。カスタマイズしたフィルタを用意し、パースできるようにします。
  • Kibanaでグラフ化すると、logstashでパースしたデータのTimezoneが標準でjpではないため、時刻がずれて表示されてしまう問題を解決します。
Date,2020/10/30,12:20:50

GitLabに設定ファイル一式を置いておきましたので参考にしてください。
リポジトリはこちら -> elastic-stack

カスタムパターンを用意

まず、標準で用意されているgrok-patternsはこのようになっています。DATEを使うと年月日の順番が合いません。また、TIMESTAMP_ISO8601は年月日がハイフン区切りとなっています。公式サイトのカスタムパターンについての説明はこちらです。

# Months: January, Feb, 3, 03, 12, December
MONTHNUM (?:0?[1-9]|1[0-2])
MONTHDAY (?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])

# Years?
YEAR (?>\d\d){1,2}

# datestamp is YYYY/MM/DD-HH:MM:SS.UUUU (or something like it)
DATE_US %{MONTHNUM}[/-]%{MONTHDAY}[/-]%{YEAR}
DATE_EU %{MONTHDAY}[./-]%{MONTHNUM}[./-]%{YEAR}
TIMESTAMP_ISO8601 %{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
DATE %{DATE_US}|%{DATE_EU}

年月日の順で並べたDATE_JPを用意し、TIMESTAMP_JPに標準のTIMEとカンマ区切りで組み合わせます。

logstash/extra_patterns/date_jp
DATE_JP %{YEAR}[/-]%{MONTHNUM}[/-]%{MONTHDAY}
TIMESTAMP_JP %{DATE_JP}[,]%{TIME}

カスタムパターンを使う

作成したdate_jpファイルを/opt/logstash/extra_patternsに割り当てます。

docker-compose.yml
  logstash01:
    build: ./logstash
    container_name: logstash01
    links:
      - es01:elasticsearch
    volumes:
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
      - ./logstash/config/jvm.options:/usr/share/logstash/config/jvm.options
      - ./logstash/config/log4j2.properties:/usr/share/logstash/config/log4j2.properties
      - ./logstash/config/pipelines.yml:/usr/share/logstash/config/pipelines.yml
      - ./logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - ./logstash/extra_patterns/date_jp:/opt/logstash/extra_patterns
    networks:
      - esnet

patterns_dirにextra_patternsを設定する。
カスタムパターンのTIMESTAMP_JPを利用し、read_timestampフィールドを作成します。

logstash.conf
filter {
  grok {
    patterns_dir => ["/opt/logstash/extra_patterns"]
    match => { "message" => "%{TIMESTAMP_JP:read_timestamp}" }
  }
}

タイムゾーンをAsia/Tokyoに設定

logstashは、デフォルトが文字列型であるため、read_timestampも文字列型となります。タイムスタンプとして認識されないため、dateフィルタを用いて、date型に変換します。dateフィルタのtimezoneをAsia/Tokyoに設定し、targetを@timestampに割り当てます。

logstash.conf
filter {
  grok {
    patterns_dir => ["/opt/logstash/extra_patterns"]
    match => { "message" => "%{TIMESTAMP_JP:read_timestamp}" }
  }
  date {
    match => ["read_timestamp", "yyyy/MM/dd,HH:mm:ss"]
    timezone => "Asia/Tokyo"
    target => "@timestamp"
  }
}

最後に

カスタムパターンを使った日付のパースとtimezoneの設定について説明しました。
今後は、csvファイルの扱い方などについて紹介したいと思います。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2