#SolitonNKでgrokが使えるようになりました
Soliton NKの内部モジュールであるgravwellのバージョンが3.2.2になったことで、検索モジュールgrokが使えるようになりました。本記事では、Soliton NKでgrokをどのように使えるのか、その概要をまとめます。
#grokが使えるってどういうこと?
Soliton NKで収集したデータから、特定のデータだけを抽出して分析したい時、正規表現を組み合わせてRegexによる検索モジュールで出すべきデータを探すことになるでしょう。しかし、目的とするデータ抽出をするのに、正規表現で適切に検索条件を表すのは、往々にして複雑で面倒になりがちです。
例えば、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 :レコード全体ではなく、指定された値を使って抽出されます。
-r :使用するパターンのリストとしてデフォルトの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にまとめて登録されています。ここには、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のパターンとして追加されます。
このall.grokで足らないパターンについては、grokを使う他のコミュニティやシステムで探すことができ、例えば、fusion server、StreamSets Data Collector、logstashなどに、様々なgrokパターンが用意されているので、それを活用することができます。
必要とするパターンをall.grokに追記し、これをgrokの名前でアップロードすれば、登録パターンが上書き更新されます。
#パターンを自作した場合
もしも、既存のパターンに自分の求めるものが無い場合、パターンを自作しましょう。自作した正規表現のデバッグには、Grok Constructorが便利です。
解析対象を模擬したレコードを「Some log lines you want to match.」の欄に入れて、抽出条件となる正規表現を「The (unquoted!) pattern that should match all logfile lines.」の欄に入れてGoボタンを押します。
例として、メールアドレスのドメイン部を抽出ために、 [a-zA-Z][a-zA-Z0-9_.+-=:]+ という条件式を作成した場合に、メールアドレスとして成り立っているレコードやメールアドレスではないレコードをテストしてみます。
抽出結果が表示されるので、意図通りのものが抽出されているかどうか確認できます。
こうして自作したパターンも、all.grokに追記してアップロードすれば、検索する際の表記に使用することができます。
成果
こうしてgrokを使ってデータ抽出したものを活用することができます。
grokを使って、各HTTPメソッドの応答コードがいくつ発せられたか計数し、それをスタックグラフに表示する場合は、
tag=apache grok "%{COMBINEDAPACHELOG}" | stats count by verb response | stackgraph verb response count
grokを使ってSolitonNKの活用の幅が広がることが分かると思います。
Soliton NKを試したい人はの下の Soliton NK 公式サポートサイトでお申し込み下さい。
Soliton NK について、今後記事を追加していく予定です。