すべてのプロダクト
Search
ドキュメントセンター

Simple Log Service:文字列から動的なキー値ペアを抽出

最終更新日:Aug 28, 2024

このトピックでは、さまざまな関数を使用して文字列から動的なキーと値のペアを抽出する方法について説明します。

関数

動的キーと値のペアの抽出は、キーワードと値を抽出して変換するプロセスです。 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_sepkv_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=ba="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: v2k3: 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: ログエントリからprotodomain、および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")
      • 特定のオーケストレーションと変換結果

        1. 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
        2. 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
        3. 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
  • 高度な変換

    verapp_typeosフィールドなどの動的フィールドを抽出する場合は、正規表現または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を解析することを推奨します。