このトピックでは、さまざまな関数を使用して文字列から動的なキーと値のペアを抽出する方法について説明します。
関数
動的キーと値のペアの抽出は、キーワードと値を抽出して変換するプロセスです。 e_kv関数、e_kv_delimit関数、およびe_regex関数を使用して、動的なキーと値のペアを抽出できます。 次の表に、さまざまなシナリオで使用できる関数を示します。
関数 | キーワード抽出 | 値の抽出 | キーワード変換 | 価値変換 |
e_kv | 特定の正規表現を使用します。 | デフォルトの文字セットと (,) や (") などの特定の区切り文字をサポートします。 | プレフィックスとサフィックスをサポートします。 | テキストエスケープをサポートします。 |
e_kv_delimit | 特定の正規表現を使用します。 | 区切り文字を使用します。 | プレフィックスとサフィックスをサポートします。 | なし。 |
e_regex | カスタム正規表現とデフォルトの文字セットを使用します。 | カスタム。 | カスタム。 | カスタム。 |
ほとんどの場合、e_kv
関数を使用してキーと値のペアを抽出できます。特に、囲まれた文字やバックスラッシュ (\) を抽出してエスケープする必要がある場合はそうです。 複雑なシナリオでは、e_regex
関数を使用してキーと値のペアを抽出できます。 特定のシナリオでは、e_kv_delimit
関数を使用してキーと値のペアを抽出する必要があります。
キーワードの抽出
方式
e_kv
関数、e_kv_delimit
関数、またはe_regex
関数を使用してキーワードを抽出する場合、関数は抽出制約に準拠する必要があります。 詳細については、「抽出用フィールド名の制限」をご参照ください。例 1
次の例では、
k1: q=asd&a=1&b=2 &__ 1 __= 3
のログエントリからキーワードと値を抽出するために使用できる3つの方法について説明します。e_kv 関数を使用します。
生のログエントリ
k1: q=asd&a=1&b=2&__1__=3
変換ルール
# By default, keywords are extracted by using a specified character set. 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
変換ルール
# After the key-value pair is separated by an ampersand (&), extract the keywords by using the ampersand (&). 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
変換ルール
# Keywords and values are extracted by using a custom character set. 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つの方法について説明します。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 :"ak_id:"LTAiscW,"ak_key:"rsd7r8f
変換ルール
キーワードの前に二重引用符 (") が存在する場合は、
e_regex
関数を使用できます。e_regex("content", r"(\w+):\"(\w+)", {r"\1": r"\2"})
結果
DSLオーケストレーション後のログ形式:
content :"ak_id:"LTAiscW,"ak_key:"rsd7r8f ak_id: LTAiscW ak_key: rsd7r8f
値の抽出
動的なキーと値のペアの間、またはキーワードと値の間に明確な識別子が存在する場合 (
a=b
やa="cxxx"
など) は、e_kv
関数を使用して値を抽出します。 例:生のログエントリ
content1: k="helloworld",the change world, k2="good"
変換ルール
この場合
、変化世界
は抽出されない。e_kv("content1") # The syntax of the e_kv_delimit function: A space character is required before k2. Therefore, k2 can be parsed only when the pair_sep parameter of the e_kv_delimit function is set to ",\s". e_kv_delimit("content1",kv_sep="=", pair_sep=",\s") # The syntax of the e_regex function. e_regex("str",r"(\w+)=(\"\w+)",{r"\1": r"\2"})
結果
抽出されたログエントリ:
content1: k="helloworld",the change world, k2="good" k1: helloworld k2: good
コンテンツ内の 文字を含むログエントリから値を抽出するには: 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
は、キーワードが抽出制約に準拠していないため削除されます。 詳細については、「抽出用フィールド名の制限」をご参照ください。区切り文字で区切られた一部のキーと値のペアには特殊文字が含まれていますが、特定の文字で囲まれていません。 このようなキーと値のペアから値を抽出するには、e_kv_delimit関数を使用することを推奨します。 例:
生のログエントリ
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
関数を使用します。 例:生のログエントリ
""" In this example, the backlash (\) character is not an escape character. """ content2: k1:"v1\"abc", k2:"v2", k3: "v3"
変換ルール1
e_kv("content2",sep=":", quote='"')
結果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
関数を使用してキーと値のペアを抽出します。 設定例:生のログエントリ
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
関数
一般的なオーケストレーション
# Parse the request field. e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)? @)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?")) # Parse the uri_param field. e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\? %{GREEDYDATA:uri_query}")) # Expand the key-value pairs. 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: https
Grok関数を使用して、
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.3
request
フィールドを解析するだけでよい場合は、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_kv_delimit関数を使用できます。 例:正規表現を使用します。
e_regex("url", r"\b(\w+)=([^=&]+)", {r"\1": r"\2"})
e_kv_delmit
関数を使用します。e_kv_delimit("url", pair_sep=r"? &")
まとめ
ほとんどのURLは、上記の関数を使用して解析できます。
e_kv
関数を使用して、生のログエントリからURLを解析することを推奨します。