ログの解析
ログパーサを使用すると、不規則な形のログをクエリが可能な構造化された形に変更できます。 WhaTapログモニタリングは、次の2つのタイプのパーサを提供します。
-
GROKパーサ: 任意の形で収集されるログを正規表現式とGROK文法を活用してパーシングします。
-
JSONパーサ: JSON形式で収集されるログをパーシングします。
共通の注意事項
-
同じカテゴリに複数のパーサが登録されている場合、最初にマッチングされるパーサのみが適用されます。
-
WhaTapはWhaTapサービスの安定性に影響を与えるパーサを非活性化にする権限を持ちます。
GROKパーサ
ログが不規則な形で収集される場合、GROKパーサを使用してログをパーシングできます。 GROK文法は、named regular expressionsを提供し、正規表現式をより簡単かつ便利に使用できます。
GROKパーサーパターンの登録については、次の動画ガイドを参考にしてください。
GROKを開始する
GROKは2種類の文法を提供します。
-
%{SYNTAX:SEMANTIC}
: GROKライブラリーが提供する文法です。 named regular expressionsを活用してタグを抽出することができます。 活用例は 次へを参照してください。-
SYNTAX: GROKが提供するnamed regular expressionsを指定します。
-
SEMANTIC: マッチングされる値に付ける名前を指定します。
ノートnamed regular expressions
GROKが提供する文法です。 複雑な正規表現式に名前 を付けて使用できるよう、GROKが提供する機能です。
name regular expression WORD \b\w+\b
SPACE \s*
NOTSPACE \S+
UUID [A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}
WhaTapで提供するすべてのnamed regular expressionsを確認したい場合は、次のリンクを参考にしてください。
-
-
(?<SEMANTIC>REGX)
: 正規表現式のnamed capturing group文法です。 正規表現式を活用して、ユーザーの意図に合わせてタグを抽出できます。 活用例は次へを参照してください。-
SEMANTIC: マッチングされる値に付ける名前を指定します。
-
REGX: マッチングに使用する正規表現式を入力します。
ノートnamed capturing group
正規表現式で提供する文法です。
-
capturing group: 複数のトークンを1つにまとめて1つのマッチング単位で使用する機能を意味します。
-
named capturing group: capturing groupに名前を付けたものです。
-
文字列マッチングの例を見てみましょう。 dev@whatap.io
- 例1
(\w+)@(\w+\.\w+)
- 例2 Eメールすべてのマッチング及びusernameとdomain追加マッチングすると
(?<username>\w+)@(?<domain>\w+\.\w+)
- 例1
-
%{SYNTAX:SEMANTIC}
活用例
次は%{SYNTAX:SEMANTIC}
文法を活用する例です。
[2023-08-08 02:02:30,101 GMT][INFO ][i.w.y.l.c.LogSinkDexScheduleThread.realProcess(159)] 8 VirtualLog 20230808 02:01:00.000 {area=4, city=5} 56ms
サンプルログを見て、各単語が意味する内容を推測できます。 各部分をsemanticな単語に置き換えると、次のように表現できます。
[date][logLevel][caller] projectCode logCategiry dexBuildStartTime {area=areaEnum, city=cityEnum} dexBuildElapsed
semanticな単語すべて、正規表現式に置き換えることができます。 GROKパーサを使用すると、事前に定義されたnamed regular expressionsを活用できます。 ここで使われたTIMESTAMP_ISO8601
,LOGLEVEL
,DATA
は、GROKが提供するnamed regular expressionsです。 これらの値は、それぞれ次の正規表現式に置き換えられてマッチングされます。
-
name:
TIMESTAMP_ISO8601
- regular expression:
%{YEAR}-%{MONTHNUM}-%{MONTHDAY}[T ]%{HOUR}:?%{MINUTE}(?::?%{SECOND})?%{ISO8601_TIMEZONE}?
- regular expression:
-
name:
LOGLEVEL
- regular expression:
LOGLEVEL ([Aa]lert|ALERT|[Tt]race|TRACE|[Dd]ebug|DEBUG|[Nn]otice|NOTICE|[Ii]nfo|INFO|[Ww]arn?(?:ing)?|WARN?(?:ING)?|[Ee]rr?(?:or)?|ERR?(?:OR)?|[Cc]rit?(?:ical)?|CRIT?(?:ICAL)?|[Ff]atal|FATAL|[Ss]evere|SEVERE|EMERG(?:ENCY)?|[Ee]merg(?:ency)?)
- regular expression:
-
name:
DATA
- regular expression:
.*?
- regular expression:
\[%{TIMESTAMP_ISO8601:date}\sGMT\]\[%{LOGLEVEL:level}\s\]\[%{DATA:caller}\]