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

Keyvalue フォーマットのログのパース

通常ログ ファイルには、キーと値のペア構造を持つ情報が含まれています。keyvalue オペレータで各値とペアになるキーを指定してログ メッセージから値を取得できます。

たとえば、ログには次のようなキー (強調表示部分) が含まれています。

このログ メッセージから keyvalue オペレータを使用して 1 つ以上のキーの値を取得できます。たとえば、"remote_ip" 値に関する情報のみを表示する場合は、次のクエリを実行します。

... | keyvalue "remote_ip" ...

結果は次のようになります。

keyvalue オペレータは次の 2 つの明示的なモードで使用することもできます。

  • デフォルトの推測モード。keyvalue オペレータは正規表現の内部リストを使用して、指定されたキーの値の抽出方法を判断します。
  • 正規表現モード。正規表現に基づいてキーと値を明示的に検索します。

推測モードの構文

デフォルトの推測モードで使用する場合、keyvalue オペレータは正規表現の内部リストを使用して、指定されたキーの値の抽出方法を判断します。次に構文の概略を示します。

たとえば、キー "module" と "thread" およびそれらの値をログ メッセージから抽出するには、次のクエリを実行します。

* | keyvalue infer "module", "thread"

結果は次のようになります。

正規表現モードの構文

正規表現モードでは、正規表現に基づいて明示的にキーと値を検索する必要があります。正規表現にはキーのキャプチャ グループと値のキャプチャ グループが必要です。このため、推測モードよりも柔軟性があります。

たとえば、次のような多数のキー/値ペアを含むログがあるとします。

2017-09-08 21:01:58:552 INFO com.netflix.tracing.RequestTrace:1 [http-0.0.0.0-7101-89] [log] reqId=b588ab0b-858a-4ea5-ba78-8a68a3b609d3-96 {perf.response_time_ms=129, request.trace_local_flag=true, serviceinfo.IP=10.211.77.111, request.country=US, perf.request_start_timestamp_ms=1339189318397, serviceinfo.service_name=API, request.method=GET}

キー "serviceinfo.IP" と "perf.request_start_timestamp_ms" の値をログ メッセージから抽出するには、次のクエリを使用します。

* | keyvalue regex "\s(.*?)=(.*?)," keys "serviceinfo.IP", "perf.request_start_timestamp_ms" as ip, start_ms

keyvalue オペレータには単一キャプチャ グループを含む正規表現も使用できます。キャプチャ グループはキー/値ペアの値と一致する必要があります。単一一致グループを含むクエリを実行すると、パフォーマンスが向上する場合があります。たとえば、同じログについて、前述のクエリと同じ結果を得るには、次のクエリを実行することもできます。

* | keyvalue regex "=(.*?)," "serviceinfo.IP", "perf.request_start_timestamp_ms"

上の場合、指定した各キーについて、オペレータはまずメッセージ内の初回のキーを検索した後に、メッセージ内のこのキーがある場所に最も近い正規表現の一致を検索します。

"as" 句で指定したフィールドの数は、指定したキー/値ペアの数と一致する必要があります。抽出値のフィールド名をオペレータに自動作成させる場合は、この句を省略できます。この場合、keyvalue は a..z、A..Z、0..9、_ 以外のすべての文字をアンダースコア (_) に置き換えます。

省略形構文

keyvalue オペレータは両方のモード (推測または正規表現) で省略形が使用できます。たとえば、次のクエリを実行するとします。

* | keyvalue infer keys "<a>", "<b>"

このクエリは次のクエリの実行結果と同じものを出力します。

* | keyvalue "<a>", "<b>"

また、keyvalue は "kv" と略すことができます。例:

* | kv "<a>", "<b>"

キー/値ペアの自動抽出

keyvalue では、デフォルトの推測モードで auto モード (省略可能) を使用できます。

* | keyvalue auto ...

このモードを有効にすると、オペレータは最大 N 個の非参照フィールド ("keys foo,bar,..." 形式に明示的には含まれないフィールド) を抽出できます。N のデフォルトは 100 です。メッセージに N 個を超えるキー/値ペアがある場合、オペレータはメッセージの最初の N 個のキー/値ペアを抽出します (左から右の順序)。重複がある場合は、最後のものが抽出されます。

キー/値ペアのキーと値の区切りには次の区切り文字のいずれかを使用できます。

: = ->

後でクエリでキーを使用する場合は、明示的に参照する必要があります。

その他のオプション

  • as を使用したエイリアス (名前の変更) がサポートされます。例:

* | keyvalue auto keys "<key1>", "<key2>" as <field1>, <field2>

  • refonly は参照キーのみを抽出します。このオプションを使用しないと、keyvalue auto はメッセージ内で検索された他のすべてのフィールドを抽出します。

* | kv auto keys "<key1>", "<key2>"  refonly

例:

"foo": "bar"

'my key' -> "my value"

'\"#$&@_--34234\"" -> '\'@#@!$!*\' '

  • field=field_name でフィールドを指定して、デフォルト メッセージ以外をパースできます。詳細については、「Parse field」を参照してください。

* | keyvalue field=<field> [infer keys]

* | keyvalue auto field=<field> [keys]

* | keyvalue field=<field> regex "<regex>" [keys]

  • nodrop を使用すると、パース用語のセグメントと一致しないメッセージも結果に追加します。詳細については、「Parse nodrop」を参照してください。
  • この記事は役に立ちましたか?