はじめに
どうも!生産技術部で製品の検査工程を担当しているエンジニアです。脱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とカンマ区切りで組み合わせます。
DATE_JP %{YEAR}[/-]%{MONTHNUM}[/-]%{MONTHDAY}
TIMESTAMP_JP %{DATE_JP}[,]%{TIME}
カスタムパターンを使う
作成したdate_jpファイルを/opt/logstash/extra_patterns
に割り当てます。
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フィールドを作成します。
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に割り当てます。
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ファイルの扱い方などについて紹介したいと思います。