Keyvalue フォーマットのログの parse
通常ログ ファイルには、キーと値のペア構造を持つ情報が含まれています。keyvalue operator で各値とペアになるキーを指定してログ メッセージから値を取得できます。
たとえば、ログには次のようなキー (強調表示部分) が含まれています。
このログ メッセージから keyvalue operator を使用して 1 つ以上のキーの値を取得できます。たとえば、"remote_ip" 値に関する情報のみを表示する場合は、次のクエリを実行します。
... | keyvalue "remote_ip" ...
結果は次のようになります。
keyvalue operator は次の 2 つの明示的なモードで使用することもできます。
- デフォルトの推測モード。keyvalue operator は正規表現の内部リストを使用して、指定されたキーの値の抽出方法を判断します。
- 正規表現モード。正規表現に基づいてキーと値を明示的に検索します。
推測モードの構文
デフォルトの推測モードで使用する場合、keyvalue operator は正規表現の内部リストを使用して、指定されたキーの値の抽出方法を判断します。次に構文の概略を示します。
たとえば、キー "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 operator には単一キャプチャ グループを含む正規表現も使用できます。キャプチャ グループはキー/値ペアの値と一致する必要があります。単一一致グループを含むクエリを実行すると、パフォーマンスが向上する場合があります。たとえば、同じログについて、前述のクエリと同じ結果を得るには、次のクエリを実行することもできます。
* | keyvalue regex "=(.*?)," "serviceinfo.IP", "perf.request_start_timestamp_ms"
上の場合、指定した各キーについて、operator はまずメッセージ内の初回のキーを検索した後に、メッセージ内のこのキーがある場所に最も近い正規表現の一致を検索します。
"as" 句で指定したフィールドの数は、指定したキー/値ペアの数と一致する必要があります。抽出値のフィールド名を operator に自動作成させる場合は、この句を省略できます。この場合、keyvalue は a..z、A..Z、0..9、_ 以外のすべての文字をアンダースコア (_) に置き換えます。
省略形構文
keyvalue operator は両方のモード (推測または正規表現) で省略形が使用できます。たとえば、次のクエリを実行するとします。
* | keyvalue infer keys "<a>", "<b>"
このクエリは次のクエリの実行結果と同じものを出力します。
* | keyvalue "<a>", "<b>"
また、keyvalue は "kv" と略すことができます。例:
* |
kv
"<a>", "<b>"
キー/値ペアの自動抽出
keyvalue operator では、デフォルトの推測モードで auto モード (省略可能) を使用できます。
* | keyvalue auto ...
このモードを有効にすると、operator は最大 N 個の非参照フィールド ("keys foo,bar,..." 形式に明示的には含まれないフィールド) を抽出できます。N のデフォルトは 100 です。メッセージに N 個を超えるキー/値ペアがある場合、operator はメッセージの最初の N 個のキー/値ペアを抽出します (左から右の順序)。重複がある場合は、最後のものが抽出されます。
キー/値ペアのキーと値の区切りには次の区切り文字のいずれかを使用できます。
: = ->
後でクエリでキーを使用する場合は、明示的に参照する必要があります。
その他のオプション
- as を使用したエイリアス (名前の変更) がサポートされます。例:
* | keyvalue auto keys "<key1>", "<key2>" as <field1>, <field2>
- refonly は参照キーのみを抽出します。このオプションを使用しないと、keyvalue auto はメッセージ内で検索された他のすべてのフィールドを抽出します。
* | kv auto keys "<key1>", "<key2>"
refonly
- field=field_name でフィールドを指定して、デフォルト メッセージ以外を parse できます。詳細については、「Parse field」を参照してください。
* | keyvalue field=<field> [infer keys]
* | keyvalue auto field=<field> [keys]
* | keyvalue field=<field> regex "<regex>" [keys]
- nodrop を使用すると、parse 用語のセグメントと一致しないメッセージも結果に追加します。詳細については、「Parse nodrop」を参照してください。