メインコンテンツまでスキップ
Sumo Logic Japanese

正規表現を使用した parse 変数パターン

Parse Regex operator (extract operator とも呼ばれる) で正規表現構文を使用して、ログ行から複雑なデータを抽出できます。たとえば、ネストされたフィールドを抽出する場合に Parse regex を使用します。

抽出済みまたは parse されたフィールドなどのユーザが追加したフィールドは、英数字とアンダースコア ("_") を使用して名前を付けることができます。これらのフィールドの名前の最初と最後は、英数字である必要があります。

正規表現の詳細については、Perl ドキュメントを参照してください。または正規表現テスター (regex101.com) を使用してみてください。

構文

  • | parse regex "<start_expression>(?<field_name><field_expression>)<stop_expression>"
  • | parse regex "<start_expression>(?<field_name><field_expression>)<stop_expression>" [nodrop]
  • | parse regex [field=<field_name>] "<start_expression>(?<field_name><field_expression>)<stop_expression>"
     
  • "extract" を代わりに使用できます。 
    | extract "<start_expression>(?<field_name><field_expression>)<stop_expression>"

オプション

  • field=<field_name> 

    field=fieldname オプションを使用すると、フィールドを指定して、デフォルト メッセージ以外を parse できます。詳細については、「Parse field」を参照してください。 

  • nodrop  

    nodrop オプションは parse 用語のセグメントと一致しないメッセージも結果に含めるようにします。詳細については、「Parse nodrop」を参照してください。

  • multi 

    multi オプションを使用すると、1 つのログ メッセージ内の複数の値を parse できます。「Parse multi」を参照してください。

ルール

  • 引用符で囲んだ有効な JAVA または RE2 正規表現を使用します。
  • 検索では大文字と小文字は区別されます。テキスト セグメントのいずれも一致しない場合、変数は割り当てられません。
  • フィールドを指定しないと、受信メッセージのテキスト全体が使用されます。
  • 複数の parse 式は指定順に処理されます。各式は常にメッセージ文字列の先頭から検索を開始します。
  • 複数の parse 式は用語をコンマ区切りにして、省略形式で記述できます。
  • parse anchor operator で使用できます。
  • ネストした名前付きキャプチャ グループは使用できません。
  • parse regex operator で使用できるのは、1 つ以上の名前付きキャプチャ グループを含む正規表現のみです。キャプチャ グループを含まないか、名前なし/番号付きキャプチャ グループを含む正規表現はサポートされません。詳細については、「Named Capturing Groups (名前付きキャプチャ グループ)」を参照してください。

    通常の正規表現を次の手順で名前付きキャプチャ グループに変換できます。

    丸括弧で正規表現全体を囲んで、"?" を追加し、その後にキャプチャ グループ名を "<>" で囲んで追加します。次の例を見てみましょう。強調表示された部分が追加されたところです。

    通常の正規表現 キャプチャ グループ名を付けた正規表現
    \d{3}-[\w]* (?<regex>\d{3}-[\w]*)

    正規表現にキャプチャ グループがふくまれている (正規表現の一部が丸括弧に囲まれている) 場合、2 つのオプションがあります。

    1. 非キャプチャ グループに変換します。この場合、正規表現のこの部分は Sumo フィールドとして抽出されません。"?:" をグループの開始括弧の直後に挿入すれば、簡単に変換できます。

    通常の正規表現 非キャプチャ グループを含む正規表現
    (abc|\d{3}) (?:abc|\d{3})
    1. 正規表現内の番号付きキャプチャ グループから名前付きキャプチャ グループへ値を抽出する場合は、番号付きキャプチャ グループを名前付きキャプチャ グループへ変換できます。"?" を追加して、"<>" でキャプチャ グループ名を囲みます。名前付きキャプチャ グループで指定された名前でフィールドが作成されます。

    通常の正規表現 キャプチャ グループ名を付けた正規表現
    (abc|\d{3}) (?<test_group>abc|\d{3})

例 

IP アドレスの parse

ログから IP アドレスを抽出する場合は、次のような parse regex を使用するだけです。

... | parse regex "(?<ip_address>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" | ...

1 つのクエリで複数のフィールドを parse します。

Parse regex では、1 つのクエリで複数のフィールドを parse できます。たとえば、ログからユーザ名とホスト情報を parse するとします。クエリは次のようになります。

... | parse regex "user=(?<user>.*?):" 
| parse regex "host=(?<msg_host>.*?):" 
| ...

非キャプチャ グループを使用するために OR 条件を指定する

OR 条件を使用して、正規表現と一致する可能性が複数ある場合に対応するには、非キャプチャ グループ (?: 正規表現) の使用をお勧めします。

正規表現内で文字列の選択肢のリストを指定するには、グループ構文を使用します。例えば、次の 2 つのログ行に対応するとします。

Oct 11 18:20:49 host123.example.com 16234563: Oct 11 18:20:49: %SEC-6-IPACCESSLOGP: list 101 denied tcp 10.1.2.3(1234) -> 10.1.2.4(5678), 1 packet
Oct 11 18:20:49 host123.example.com 16234564: Oct 11 18:20:49: %SEC-6-IPACCESSLOGP: list 101 accepted tcp 10.1.2.5(4321) -> 10.1.2.6(8765), 1 packet

"protocol" を抽出するには次のクエリを記述します。

| parse regex "list 101 (accepted|denied) (?<protocol>.*?) "

したがって、実際のクエリは次のようになります。

| parse regex "list 101 (?:accepted|denied) (?<protocol>.*?) "

ただし、"accepted" か "denied" かも名前付きキャプチャにする場合は次のようにします。

| parse regex "list 101 (?<status>accepted|denied) (?<protocol>.*?) "

Parse multi

1 つのフィールド値の parse だけではなく、multi オプション (parse multi とも呼ばれる) を指定すると、1 つのログ メッセージ内の複数の値を parse できます。つまり、multi キーワードを使用すると、値の数が可変のメッセージあっても、parse regex operator はログ メッセージ内の最初の値だけでなく、すべての値を検索します。このプロセスの一環として、multi キーワードは各メッセージのコピーを作成するので、フィールドの各値をカウントできます。

たとえば、Amazon VPC フロー ログでは、parse regex multi を使用して、同じ送信元および宛先 IP アドレスを持つメッセージを特定できます。

_sourceCategory=aws/vpc 
| parse regex "(?<ip_address>\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" multi
| count by ip_address, _raw
| where _count >1

出力は次のようになります。

ParseRegexMulti.png

大文字と小文字を区別しない parse regex

正規表現パラメータとして (?i) を指定すると、パーサは大文字と小文字を区別しなくなります。たとえば、次のログ メッセージがあるとします。

Line1: The following exception was reported: error in log Line2: The following exception was reported: Error in log Line3: The following exception was reported: ERROR in log

次の parse regex 式を使用してログ内の "error" を検索します。(?i) を挿入すると、パーサはこれに続く式の大文字と小文字を区別しません。

| parse regex "reported:\s(?<exception>(?i)error)\s"

 このため、次のフィールドが parse されます。

Exception メッセージ
ERROR Line3: The following exception was reported: ERROR in log
エラー Line2: The following exception was reported: Error in log
error Line1: The following exception was reported: error in log

toLowerCase と toUpperCase operator を使用することもできます。 

  • この記事は役に立ちましたか?