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

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

最終更新日:Nov 09, 2025

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

一般的なメソッドの比較

文字列からキーと値のペアを抽出するには、キーワードの抽出、値の抽出、キーワードの変換、値の変換が含まれます。一般的なメソッドでは、e_kv、e_kv_delimit、e_regex などの関数を使用します。次の表は、さまざまな抽出シナリオにおけるこれら 3 つのメソッドを比較したものです。

メソッド

キーワード抽出

値の抽出

キーワード変換

値の変換

e_kv

特定の正規表現を使用します。

デフォルトの文字セット、特定の区切り文字、または括弧 () や二重引用符 (") などの区切り文字をサポートします。

プレフィックスとサフィックスをサポートします。

文字のエスケープをサポートします。

e_kv_delimit

特定の正規表現を使用します。

区切り文字を使用します。

プレフィックスとサフィックスをサポートします。

デフォルトではなし。

e_regex

カスタム正規表現とデフォルトの文字セットフィルターを組み合わせます。

完全にカスタマイズ可能。

カスタマイズ可能。

カスタマイズ可能。

e_kv 関数は、ほとんどのキーと値のペアの抽出に十分です。特に、囲まれた文字やバックスラッシュを抽出してエスケープする必要がある場合に適しています。複雑なシナリオや高度なシナリオでは、e_regex 関数を使用します。一部の特定のシナリオでは、e_kv_delimit 関数の方が簡単に使用できます。

キーワードを抽出する

  • 方法

    e_kve_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_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 :"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=ba="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: v2k3: 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: ログを解析して、protodomainparam などのフィールドを抽出します。

      • 要件 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")
      • 特定のルールとその結果

        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_regex("url", r"\b(\w+)=([^=&]+)", {r"\1": r"\2"})
    • e_kv_delimit 関数を使用する

      e_kv_delimit("url", pair_sep=r"?&")
  • 概要

    この Topic で説明されている関数を使用して、ほとんどの URL フォーマットを解析できます。ただし、この例の URL フォーマットでは、明確でシンプルなソリューションを提供する e_kv 関数で十分です。