このトピックでは、さまざまなメソッドを使用して文字列からキーと値のペアを抽出する方法について説明します。
一般的なメソッドの比較
文字列からキーと値のペアを抽出するには、キーワードの抽出、値の抽出、キーワードの変換、値の変換が含まれます。一般的なメソッドでは、e_kv、e_kv_delimit、e_regex などの関数を使用します。次の表は、さまざまな抽出シナリオにおけるこれら 3 つのメソッドを比較したものです。
メソッド | キーワード抽出 | 値の抽出 | キーワード変換 | 値の変換 |
e_kv | 特定の正規表現を使用します。 | デフォルトの文字セット、特定の区切り文字、または括弧 () や二重引用符 (") などの区切り文字をサポートします。 | プレフィックスとサフィックスをサポートします。 | 文字のエスケープをサポートします。 |
e_kv_delimit | 特定の正規表現を使用します。 | 区切り文字を使用します。 | プレフィックスとサフィックスをサポートします。 | デフォルトではなし。 |
e_regex | カスタム正規表現とデフォルトの文字セットフィルターを組み合わせます。 | 完全にカスタマイズ可能。 | カスタマイズ可能。 | カスタマイズ可能。 |
e_kv 関数は、ほとんどのキーと値のペアの抽出に十分です。特に、囲まれた文字やバックスラッシュを抽出してエスケープする必要がある場合に適しています。複雑なシナリオや高度なシナリオでは、e_regex 関数を使用します。一部の特定のシナリオでは、e_kv_delimit 関数の方が簡単に使用できます。
キーワードを抽出する
方法
e_kv、e_kv_delimit、またはe_regex関数を使用してキーワードを抽出する場合、抽出されたフィールド名の制約に従う必要があります。例 1
次の例は、3 つの異なるメソッドを使用して
k1: q=asd&a=1&b=2&__1__=3ログからキーワードと値を抽出する方法を示しています。e_kv 関数
生のログ
k1: q=asd&a=1&b=2&__1__=3変換ルール
# デフォルトでは、キーワードは特定の文字セットを使用して抽出されます。 e_kv("k1")結果
k1: q=asd&a=1&b=2 q: asd a: 1 b: 2説明キーワード
__1__は、抽出されたフィールド名の制約に従っていないため抽出されません。
e_kv_delimit 関数
生ログ
k1: q=asd&a=1&b=2&__1__=3変換ルール
# アンパサンド (&) でキーと値のペアを分離した後、アンパサンド (&) を使用してキーワードを抽出します。 e_kv_delimit("k1", pair_sep=r"&")結果
k1: q=asd&a=1&b=2 q: asd a: 1 b: 2
e_regex 関数
生ログ
k1: q=asd&a=1&b=2&__1__=3変換ルール
# キーワードと値を抽出する文字セットを指定します。 e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"\1": r"\2"})結果
k1: q=asd&a=1&b=2 q: asd a: 1 b: 2
例 2
次の例は、3 つの異なるメソッドを使用して、特定の正規表現を用いて
content:k1=v1&k2=v2?k3:v3ログからキーワードを抽出する方法を示しています。e_kv 関数
生のログ
content:k1=v1&k2=v2?k3:v3変換ルール
e_kv("content",sep="(?:=|:)")結果
content:k1=v1&k2=v2?k3:v3 k1: v1 k2: v2 k3: v3説明pair_sep、kv_sep、またはsepパラメーターに文字セットを渡す場合は、(?:Character set)の形式で非キャプチャグループを使用します。
e_kv_delimit 関数
生のログ
content:k1=v1&k2=v2?k3:v3変換ルール
e_kv_delimit("content",pair_sep=r"&?",kv_sep="(?:=|:)")結果
content:k1=v1&k2=v2?k3:v3 k1: v1 k2: v2 k3: v3
e_regex 関数
生ログ
content:k1=v1&k2=v2?k3:v3変換ルール
e_regex("content",r"([a-zA-Z0-9]+)[=|:]([a-zA-Z0-9]+)",{r"\1": r"\2"})処理結果
content:k1=v1&k2=v2?k3:v3 k1: v1 k2: v2 k3: v3
例 3
次の例のような複雑な文字列の場合、
e_regex関数を使用する方が便利です。生のログ
content :"key1:"value1,"key2:"value2変換ルール
キーワードの前に二重引用符 (") がある場合、
e_regex関数を使用して抽出できます。e_regex("content", r"(\w+):\"(\w+)", {r"\1": r"\2"})結果
Data Shipping Language (DSL) オーケストレーション後のログフォーマットは次のとおりです。
content :"key1:"value1,"key2:"value2 key1: value1 key2: value2
値を抽出する
キーと値のペア、またはキーワードと値が
a=bやa="cxxx"などの明確な識別子で区切られている場合は、e_kv関数を使用できます。生のログ
content1: k1="helloworld",the change world, k2="good"変換ルール
この場合、e_kv 関数は
the change worldを抽出しません。e_kv("content1") # e_kv_delimit 関数の構文: k2 の前にスペースがあることに注意してください。したがって、k2 を解析するには、e_kv_delimit 関数の pair_sep パラメーターを `,\s` に設定する必要があります。そうしないと、k2 は解析できません。 e_kv_delimit("content1",kv_sep="=", pair_sep=",\s") # e_regex 関数の構文。 e_regex("str",r"(\w+)=(\"\w+)",{r"\1": r"\2"})結果
処理されたログは次のとおりです。
content1: k1="helloworld",the change world, k2="good" k1: helloworld k2: good
二重引用符 (
") を含み、content:k1="v1=1"&k2=v2?k3=v3形式のログの場合、e_kv関数を使用して値を抽出できます。例:生のログ
content:k1="v1=1"&k2=v2?k3=v3変換ルール
e_kv("content",sep="=", quote="'")結果
処理されたログは次のとおりです。
content: k1='v1=1'&k2=v2?k3=v3 k1: v1=1 k2:v2 k3:v3
e_kv_delimit関数をルールe_kv_delimit("ctx", pair_sep=r"&?", kv_sep="=")で使用すると、k2: v2とk3: v3のみが解析されます。これは、最初に抽出されたキーと値のペアのキーワードがk1="v1であり、抽出されたフィールド名の制約に従っておらず、破棄されるためです。値に特殊文字が含まれているが、引用符やその他のデリミタで囲まれていないシナリオを考えてみましょう。例:
生のログ
content: rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice|変換ルール(推奨)
e_kv_delimit 関数はこのシナリオに適しています。
e_kv_delimit("content", pair_sep="|", kv_sep=" eat ")結果(推奨)
処理されたログは次のとおりです。
content: rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice| kittens: fish, mice chicks: bugs, rice rats: rice, oil変換ルール(非推奨)
e_kv関数は値を完全に解析できません。e_kv("f1", sep="eat")結果(非推奨)
処理されたログは次のとおりです。
content: rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice| kittens: fish chicks: bugs rats: rice
キーワードを変換する
e_kvおよびe_kv_delimit関数を使用して、prefix="", suffix=""パラメーターを設定することでキーワードと値を変換できます。生のログ
k1: q=asd&a=1&b=2変換ルール
e_kv("k1", sep="=", quote='"', prefix="start_", suffix="_end") e_kv_delimit("k1", pair_sep=r"&", kv_sep="=", prefix="start_", suffix="_end") e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"start_\1_end": r"\2"})結果
変換されたキーワードは次のとおりです。
k1: q=asd&a=1&b=2 start_q_end: asd start_a_end: 1 start_b_end: 2
e_regex関数は、キーワードを変換するためのより高度な機能を提供します。例:変換ルール
e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"\1_\1": r"\2"})結果
変換されたキーワードは次のとおりです。
k1: q=asd&a=1&b=2 q_q: asd a_a: 1 a_a: 2
値の処理
k1:"v1\"abc"のような形式のログで、値にエスケープされた二重引用符が含まれている場合、e_kv関数を使用して値を抽出できます。他の 2 つのメソッドはこのシナリオでは使用が困難です。生のログ
""" ここでは、バックスラッシュ (\) は通常の文字であり、エスケープ文字ではありません。 """ content2: k1:"v1\"abc", k2:"v2", k3: "v3"変換ルール 1
e_kv("content2",sep=":", quote='"')次のルールが e_kv 関数に適用されます。
結果 1
処理されたログは次のとおりです。
content2: k1:"v1\"abc", k2:"v2", k3: "v3" k1: v1\ k2: v2 k3: v3変換ルール 2
e_kv関数のescapeパラメーターを使用すると、バックスラッシュ (\) などのエスケープ文字を含む値を正しく解析できます。例:e_kv("content2",sep=":", quote='"',escape=True)結果 2
処理されたログは次のとおりです。
content2: k1:"v1\"abc", k2:"v2", k3: "v3" k1: v1"abc k2: v2 k3: v3
a='k1=k2\';k2=k3'形式のログの場合、値を抽出するにはe_kv関数が最も適したメソッドです。他の 2 つのメソッドは使用が困難です。生のログ
data: i=c10 a='k1=k2\';k2=k3'変換ルール 1
デフォルトでは、
e_kv関数のescapeパラメーターは `False` です。次の結果が返されます。e_kv("data", quote="'")結果 1
処理されたログは次のとおりです。
a: k1=k2\ i: c10 k2: k3変換ルール 2
e_kv関数のescapeパラメーターを使用すると、バックスラッシュ (\) などのエスケープ文字を含む値を正しく解析できます。例:e_kv("data", quote="'", escape=True)結果 2
処理されたログは次のとおりです。
data: i=c10 a='k1=k2\';k2=k3' i: c10 a: k1=k2';k2=k3
複雑な値の変換
生のログ
content: rats eat rice|chicks eat bugs|kittens eat fish|変換ルール
e_regex関数を使用して値を変換できます。e_regex("content", r"\b(\w+) eat ([^\|]+)", {r"\1": r"\2 by \1"})結果
処理されたログは次のとおりです。
content: rats eat rice|chicks eat bugs|kittens eat fish| kittens: fish by kittens chicks: bugs by chicks rats: rice by rats
顧客のユースケース
このセクションでは、Web サイトのログ内の URL からデータを抽出する必要があるユースケースについて説明します。要件に基づいてログを処理するための変換ルールを設計できます。
初期変換
要件
要件 1: ログを解析して、
proto、domain、paramなどのフィールドを抽出します。要件 2:
paramフィールドのキーと値のペアを展開します。
生のログ
__source__: 192.168.0.100 __tag__:__client_ip__: 192.168.0.200 __tag__:__receive_time__: 1563517113 __topic__: request: https://example.com/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0変換メソッド
全体的なルール
# まず、リクエストの内容を解析します。 e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)?@)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?")) # 次に、uri_param を解析します。 e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\?%{GREEDYDATA:uri_query}")) # キーと値のペアを展開します。 e_kv("uri_query")特定のルールとその結果
GROK パターンを使用して
requestフィールドを解析できます。正規表現を使用してフィールドを解析することもできます。詳細については、「GROK 関数」および「GROK パターン」をご参照ください。
e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)?@)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?"))結果:
uri_domain: example.com uri_param: /video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 uri_proto: httpsGROK パターンを使用して
uri_paramフィールドを解析できます。e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\?%{GREEDYDATA:uri_query}"))処理結果:
uri_path: /video/getlist/s uri_query: ver=3.2.3&app_type=supplier&os=Android8.1.0次のように
uri_paramからフィールドを抽出できます。e_kv("uri_query")処理結果:
app_type: supplier os: Android8.1.0 ver: 3.2.3
結果
処理されたログをプレビューします:
__source__: 192.168.0.100 __tag__:__client_ip__: 192.168.0.200 __tag__:__receive_time__: 1563517113 __topic__: request: https://example.com/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 uri_domain: example.com uri_path: /video/getlist/s uri_proto: https uri_query: ver=3.2.3&app_type=supplier&os=Android8.1.0 app_type: supplier os: Android8.1.0 ver: 3.2.3requestフィールドのみを解析する必要がある場合は、e_kv 関数を直接使用できます。例:e_kv("request")処理されたログをプレビューします:
__source__: 192.168.0.100 __tag__:__client_ip__: 192.168.0.200 __tag__:__receive_time__: 1563517113 __topic__: request: https://example.com/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 app_type: supplier os: Android8.1.0 ver: 3.2.3さらなる変換
ver、app_type、osなどの動的フィールドを抽出するには、次の変換ルールを使用できます。正規表現を使用する
e_regex("url", r"\b(\w+)=([^=&]+)", {r"\1": r"\2"})e_kv_delimit関数を使用するe_kv_delimit("url", pair_sep=r"?&")
概要
この Topic で説明されている関数を使用して、ほとんどの URL フォーマットを解析できます。ただし、この例の URL フォーマットでは、明確でシンプルなソリューションを提供する
e_kv関数で十分です。