SolitonNKでgrokが使えるようになったぞ - ログ解析のための抽出テンプレートを便利に使おう

#SolitonNKでgrokが使えるようになりました

Soliton NKの内部モジュールであるgravwellのバージョンが3.2.2になったことで、[検索モジュールgrok](https://dev.gravwell.io/docs/#!search/grok/grok.md)が使えるようになりました。本記事では、Soliton NKでgrokをどのように使えるのか、その概要をまとめます。

#grokが使えるってどういうこと？

Soliton NKで収集したデータから、特定のデータだけを抽出して分析したい時、正規表現を組み合わせて[Regexによる検索モジュール](https://dev.gravwell.io/docs/#!search/regex/regex.md)で出すべきデータを探すことになるでしょう。しかし、目的とするデータ抽出をするのに、正規表現で適切に検索条件を表すのは、往々にして複雑で面倒になりがちです。


例えば、Apacheのcombined形式のフォーマットで書かれたログを全て抽出したいという場合、適切な正規表現は次のようなものだということです！


	(?P<ip>\S+) (?P<remote_log_name>\S+) (?P<userid>\S+) \[(?P<date>\S+) ?(?P<timezone>\S+)?\] \"(?P<request_method>\S+) (?P<path>\S+) (?P<request_version>HTTP/\d+\.?\d*)?\" (?P<status>\d+) (?P<length>\d+) \"(?P<referrer>[^\"]+)\" \"(?P<user_agent>[^\"]+)\"

grokが使えるようになったので、この複雑な正規表現を用いた抽出条件が、

	%{COMBINEDAPACHELOG}

という簡単な名前だけで、Apacheのcombinedログの抽出を指示できるようになります。grokは複雑な正規表現で表される典型的な抽出パターンに名前をつけて再利用できるようにする仕組みだと言えます。

grok を用いると、デフォルトでは指定されたリソース全体からマッチするレコードが抽出されますが、いくつかのオプションが使えます。
-e <arg>：レコード全体ではなく、指定された値を使って抽出されます。
-r <resource>：使用するパターンのリストとしてデフォルトのgrokリソースではなく、指定された名前のリソースからgrokパターンがロードして用いられます。
-v：逆モードで動作します。指定されたパターンに一致しないレコードだけが抽出されます。このオプションを使用する場合、他のフィルターを指定できません。
-p：「-p」オプションは、条件式と全く一致しない場合にエントリを許可するようにgrokに指示します。許容フラグは、フィルターの動作を変更しません。

#grokで使えるパターン

grokの使い方が分かったところで、grokでどのようなパターンが使えるかを見ていきましょう。

grokにデフォルトで登録されている基本的なパターンのリストは
https://dev.gravwell.io/docs/#!search/grok/grok.md#Pre-defined_Patterns
にあります。

また、Soliton NKで扱うことが多そうな、各種サーバやシステムのログに関する抽出パターンが[all.grok](https://raw.githubusercontent.com/gravwell/resources/master/grok/all.grok)にまとめて登録されています。ここには、apacheのログ、http.log、dns.log、conn.log、files.log、NetScreen firewall logs、Cisco ASA、Shorewall firewall logs、syslog、haproxy log、NAGIOS などを扱う時に典型的な抽出パターンが網羅されています。

このall.grokに登録されたパターンを使いたいときは、all.grokをgrokという名前でアップロードすることによって、grokのパターンとして追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/655de3cc-35c4-ceaa-9261-f4ea1b624478.png)


このall.grokで足らないパターンについては、grokを使う他のコミュニティやシステムで探すことができ、例えば、[fusion server](https://doc.lucidworks.com/fusion-server/5.0/reference-guides/parser-stages/grok-patterns.html)、[StreamSets Data Collector](https://streamsets.com/documentation/datacollector/latest/help/datacollector/UserGuide/Apx-GrokPatterns/GrokPatterns_title.html)、[logstash](https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns)などに、様々なgrokパターンが用意されているので、それを活用することができます。

必要とするパターンをall.grokに追記し、これをgrokの名前でアップロードすれば、登録パターンが上書き更新されます。

#パターンを自作した場合
もしも、既存のパターンに自分の求めるものが無い場合、パターンを自作しましょう。自作した正規表現のデバッグには、[Grok Constructor](http://grokconstructor.appspot.com/do/match)が便利です。

解析対象を模擬したレコードを「Some log lines you want to match.」の欄に入れて、抽出条件となる正規表現を「The (unquoted!) pattern that should match all logfile lines.」の欄に入れてGoボタンを押します。

例として、メールアドレスのドメイン部を抽出ために、 [a-zA-Z][a-zA-Z0-9_.+-=:]+ という条件式を作成した場合に、メールアドレスとして成り立っているレコードやメールアドレスではないレコードをテストしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/803598b1-e545-db44-eb32-cadb4cd75a71.png)

抽出結果が表示されるので、意図通りのものが抽出されているかどうか確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/999e2365-25b3-46ad-6601-27a487f57473.png)

こうして自作したパターンも、all.grokに追記してアップロードすれば、検索する際の表記に使用することができます。

# 成果

こうしてgrokを使ってデータ抽出したものを活用することができます。

grokを使って、各HTTPメソッドの応答コードがいくつ発せられたか計数し、それをスタックグラフに表示する場合は、

	tag=apache grok "%{COMBINEDAPACHELOG}" | stats count by verb response | stackgraph verb response count

とすることで、次のような結果が得られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480441/840d73d5-7e6f-4212-1e69-8566ca4499c4.png)

grokを使ってSolitonNKの活用の幅が広がることが分かると思います。

Soliton NKを試したい人はの下の Soliton NK 公式サポートサイトでお申し込み下さい。

https://www.solitonnk.com/

Soliton NK について、今後記事を追加していく予定です。