以前投稿した【UiPath】ロボット稼働率を見える化する(Orchestrator無し)の続編です。
ExcelじゃなくElastic Search + Kibanaでカッコ良くログ可視化しようと思い、宮一 良彦さんというスゴい方のMedium記事を参考にさせていただいたのですが、ES初心者の自分にはLogstashのfilter周りの設定(特にgrok filter)を理解するのに時間がかかりました。
色々調べてようやく理解できたので、同じように悩まれてるES初心者の方の参考になると思い、失礼と知りながら補足解説させていただきます。
解説対象、設定引用元>
ロボットのログをLogstashで集める > 設定 > logstash.conf のfilterパート
filterでやっている事のざっくり解説
まずUiPathの実行ログ1行は
①15:19:44.0976 ②Info ③{"message":"XXXX の実行が開始しました","level":"Information",...}
- ①タイムスタンプ(ただし時分秒のみ)
- ②ログレベル(Info/Error/...)
- ③ログメッセージやタイムスタンプ、マシン名などの詳細情報の詰まったJson
のように大きく3ブロックで構成されているので、それぞれをfield1, field2, field3という変数に分解しています。
ここのmatchパターン
match => { "message" => "(?<field1>(\S+)) (?<field2>(\S+)) (?<field3>(.+))" }
は次の章で解説します。
そして分解した③のfield3をJsonパースしてESに渡し、後はJson中のタイムスタンプのフォーマット指定やタイムゾーン指定をしたり、ESに送り込む必要が無いField(message, field1, field2, field3, path)を除去しています。
grokのmatchパターン解説
match => { "message" => "(?<field1>(\S+)) (?<field2>(\S+)) (?<field3>(.+))" }
を解説します。
ES公式 : Grok filter plugin > Custom Patterns によると
(?<field_name>pattern)
と定義すれば元のmessageのうちpatternに合致した部分をfield_nameに格納してくれる、と。
じゃあpatternである\S+
とか.+
って何なの?となる。
Regular Expressions (Regex) を参照
- まず
\s
は半角スペース、改行、タブ、改ページ( \n\r\t\f)いずれか1文字を指す -
\S
大文字反転で逆の意味→半角スペース、改行、タブ、改ページでない1文字 -
\S+
+は1文字以上の繰り返し→半角スペース、改行、タブ、改ページを含まない文字列
となる。
.
は"改行でない1文字"を指すので、同様に.+
は"改行を含まない文字列"になる。
field1, field2が\S+
で、field3だけ.+
なのは、field3の対象となるJsonの中に半角スペース等が入ってくる事を想定されているのだと思います。(ユーザーがLog Messageアクティビティで出力したメッセージも入ってくるので)
こうしてログ①②③それぞれのブロックを都合よく取り出せるという事です。う~ん、なるほど。
ちなみにApacheのログなど、よく世の中で使われるpattenはデフォルトで定義されているし、自前で新規patternを定義して名前を付ける事もできます。
参考 > Grok patterns
Logstash結果
設定の意味が理解できたので、上記Medium記事に従ってLogstash経由でESにフォルダに溜まったログををまとめて送り込んでみました。
Indexが作成され、Json内の各Fieldが反映されています。
Discovery画面でレコード(Document)の存在も確認できたので、ようやく可視化の準備が整いました。
今回はここまで。
思い通りにESにデータを入れてくには正規表現の理解が大事って事がわかりました。
ちなみに可視化・効果測定という意味ではForward IIIで見たUiPath Insightsを非常に期待しており、サービスとしてReadyになったら会社でぜひ検証したいと思います。