全部产品
Search
文档中心

Simple Log Service:Ekstrak pasangan kunci-nilai dinamis dari sebuah string

更新时间:Nov 09, 2025

Topik ini menjelaskan cara menggunakan berbagai metode untuk mengekstrak pasangan kunci-nilai dari sebuah string.

Perbandingan metode umum

Ekstraksi pasangan kunci-nilai dari string melibatkan ekstraksi kata kunci, ekstraksi nilai, transformasi kata kunci, dan transformasi nilai. Metode umum menggunakan fungsi seperti e_kv, e_kv_delimit, dan e_regex. Tabel berikut membandingkan ketiga metode tersebut dalam skenario ekstraksi yang berbeda.

Metode

Ekstraksi Kata Kunci

Ekstraksi Nilai

Transformasi Kata Kunci

Transformasi Nilai

e_kv

Menggunakan ekspresi reguler tertentu.

Mendukung set karakter default, pemisah tertentu, atau pemisah seperti tanda kurung () atau tanda kutip ganda (").

Mendukung awalan dan akhiran.

Mendukung karakter escaping.

e_kv_delimit

Menggunakan ekspresi reguler tertentu.

Menggunakan pemisah.

Mendukung awalan dan akhiran.

Tidak ada secara default.

e_regex

Menggabungkan ekspresi reguler kustom dengan penyaringan set karakter default.

Sepenuhnya dapat disesuaikan.

Dapat disesuaikan.

Dapat disesuaikan.

Fungsi e_kv sudah cukup untuk sebagian besar ekstraksi pasangan kunci-nilai, terutama saat Anda perlu mengekstrak dan meloloskan karakter yang diapit atau garis miring terbalik. Untuk skenario kompleks atau lanjutan, gunakan fungsi e_regex. Untuk beberapa skenario spesifik, fungsi e_kv_delimit lebih mudah digunakan.

Ekstrak kata kunci

  • Metode

    Saat menggunakan fungsi e_kv, e_kv_delimit, atau e_regex untuk mengekstrak kata kunci, Anda harus mengikuti batasan pada nama bidang yang diekstrak.

  • Contoh 1

    Contoh berikut menunjukkan cara menggunakan tiga metode berbeda untuk mengekstrak kata kunci dan nilai dari log k1: q=asd&a=1&b=2&__1__=3.

    • Fungsi e_kv

      • Log Mentah

        k1: q=asd&a=1&b=2&__1__=3
      • Aturan Transformasi

        # Secara default, kata kunci diekstraksi menggunakan set karakter tertentu.
        e_kv("k1")
      • Hasil

        k1: q=asd&a=1&b=2
        q: asd
        a: 1
        b: 2
        Catatan

        Kata kunci __1__ tidak diekstraksi karena tidak mengikuti batasan pada nama bidang yang diekstrak.

    • Fungsi e_kv_delimit

      • Log Mentah

        k1: q=asd&a=1&b=2&__1__=3
      • Aturan Transformasi

        # Setelah memisahkan pasangan kunci-nilai dengan ampersand (&), ekstrak kata kunci menggunakan ampersand (&).
        e_kv_delimit("k1", pair_sep=r"&")
      • Hasil

        k1: q=asd&a=1&b=2
        q: asd
        a: 1
        b: 2
    • Fungsi e_regex

      • Log Mentah

        k1: q=asd&a=1&b=2&__1__=3
      • Aturan Transformasi

        # Tentukan set karakter untuk mengekstrak kata kunci dan nilai.
        e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"\1": r"\2"})
      • Hasil

        k1: q=asd&a=1&b=2
        q: asd
        a: 1
        b: 2
  • Contoh 2

    Contoh berikut menunjukkan cara menggunakan tiga metode berbeda untuk mengekstrak kata kunci dari log content:k1=v1&k2=v2?k3:v3 menggunakan ekspresi reguler tertentu.

    • Fungsi e_kv

      • Log Mentah

        content:k1=v1&k2=v2?k3:v3
      • Aturan Transformasi

        e_kv("content",sep="(?:=|:)")
      • Hasil

        content:k1=v1&k2=v2?k3:v3
        k1: v1
        k2: v2
        k3: v3
        Catatan

        Saat melewatkan set karakter ke parameter pair_sep, kv_sep, atau sep, gunakan grup non-mengambil dalam format (?:Set karakter).

    • Fungsi e_kv_delimit

      • Log Mentah

        content:k1=v1&k2=v2?k3:v3
      • Aturan Transformasi

        e_kv_delimit("content",pair_sep=r"&?",kv_sep="(?:=|:)")
      • Hasil

        content:k1=v1&k2=v2?k3:v3
        k1: v1
        k2: v2
        k3: v3
    • Fungsi e_regex

      • Log Mentah

        content:k1=v1&k2=v2?k3:v3
      • Aturan Transformasi

        e_regex("content",r"([a-zA-Z0-9]+)[=|:]([a-zA-Z0-9]+)",{r"\1": r"\2"})
      • Hasil Pemrosesan

        content:k1=v1&k2=v2?k3:v3
        k1: v1
        k2: v2
        k3: v3
  • Contoh 3

    Untuk string kompleks, seperti yang ada dalam contoh berikut, fungsi e_regex lebih nyaman digunakan.

    • Log Mentah

      content :"key1:"value1,"key2:"value2
    • Aturan Transformasi

      Jika kata kunci didahului oleh tanda kutip ganda ("), Anda dapat menggunakan fungsi e_regex untuk mengekstraknya.

      e_regex("content", r"(\w+):\"(\w+)", {r"\1": r"\2"})
    • Hasil

      Format log setelah orkestrasi Data Shipping Language (DSL) adalah sebagai berikut:

      content :"key1:"value1,"key2:"value2
      key1: value1
      key2: value2

Ekstrak nilai

  • Jika pasangan kunci-nilai atau kata kunci dan nilai dipisahkan oleh pengidentifikasi jelas, seperti a=b atau a="cxxx", Anda dapat menggunakan fungsi e_kv.

    • Log Mentah

      content1:  k1="helloworld",the change world, k2="good"
    • Aturan Transformasi

      Dalam hal ini, fungsi e_kv tidak mengekstrak the change world.

      e_kv("content1")
      # Sintaks fungsi e_kv_delimit: Perhatikan bahwa ada spasi sebelum k2. Oleh karena itu, untuk mengurai k2, Anda harus menyetel parameter pair_sep fungsi e_kv_delimit ke `,\s`. Jika tidak, k2 tidak dapat diuraikan.
      e_kv_delimit("content1",kv_sep="=", pair_sep=",\s")
      # Sintaks fungsi e_regex.
      e_regex("str",r"(\w+)=(\"\w+)",{r"\1": r"\2"})
    • Hasil

      Log yang diproses adalah sebagai berikut:

      content1:  k1="helloworld",the change world, k2="good"
      k1: helloworld
      k2: good
  • Untuk log yang berisi tanda kutip ganda (") dan dalam format content:k1="v1=1"&k2=v2?k3=v3, Anda dapat menggunakan fungsi e_kv untuk mengekstrak nilai. Sebagai contoh:

    • Log Mentah

      content:k1="v1=1"&k2=v2?k3=v3
    • Aturan Transformasi

      e_kv("content",sep="=", quote="'")
    • Hasil

      Log yang diproses adalah sebagai berikut:

      content: k1='v1=1'&k2=v2?k3=v3
      k1: v1=1
      k2:v2
      k3:v3

    Jika Anda menggunakan fungsi e_kv_delimit dengan aturan e_kv_delimit("ctx", pair_sep=r"&?", kv_sep="="), hanya k2: v2 dan k3: v3 yang dapat diurai. Ini karena kata kunci dalam pasangan kunci-nilai pertama yang diekstrak adalah k1="v1, yang tidak mengikuti batasan pada nama bidang yang diekstrak dan dibuang.

  • Pertimbangkan skenario di mana nilai berisi karakter khusus tetapi tidak diapit oleh tanda kutip atau pemisah lainnya. Sebagai contoh:

    • Log Mentah

      content:  rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice|
    • Aturan Transformasi (Disarankan)

      Fungsi e_kv_delimit cocok untuk skenario ini.

      e_kv_delimit("content", pair_sep="|", kv_sep=" eat ")
    • Hasil (Disarankan)

      Log yang diproses adalah sebagai berikut:

      content:  rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice|
      kittens:  fish, mice
      chicks:  bugs, rice
      rats:  rice, oil
    • Aturan Transformasi (Tidak Disarankan)

      Fungsi e_kv tidak dapat sepenuhnya mengurai nilai.

      e_kv("f1", sep="eat")
    • Hasil (Tidak Disarankan)

      Log yang diproses adalah sebagai berikut:

      content:  rats eat rice, oil|chicks eat bugs, rice|kittens eat fish, mice|
      kittens:  fish
      chicks:  bugs
      rats:  rice

Transformasi kata kunci

  • Anda dapat menggunakan fungsi e_kv dan e_kv_delimit untuk mentransformasi (kunci) dan nilai dengan menyetel parameter prefix="", suffix="".

    • Log Mentah

      k1: q=asd&a=1&b=2
    • Aturan Transformasi

      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"})
    • Hasil

      Kata kunci yang ditransformasi adalah sebagai berikut:

      k1: q=asd&a=1&b=2
      start_q_end: asd
      start_a_end: 1
      start_b_end: 2
  • Fungsi e_regex menyediakan kemampuan tingkat lanjut untuk mentransformasi kata kunci. Sebagai contoh:

    • Aturan Transformasi

      e_regex("k1",r"(\w+)=([a-zA-Z0-9]+)",{r"\1_\1": r"\2"})
    • Hasil

      Kata kunci yang ditransformasi adalah sebagai berikut:

      k1: q=asd&a=1&b=2
      q_q: asd
      a_a: 1
      a_a: 2

Pemrosesan nilai

  • Untuk log dalam format seperti k1:"v1\"abc", di mana nilai berisi tanda kutip ganda yang diloloskan, Anda dapat menggunakan fungsi e_kv untuk mengekstrak nilai. Dua metode lainnya sulit digunakan untuk skenario ini.

    • Log Mentah

      """
      Di sini, garis miring terbalik (\) adalah karakter biasa, bukan karakter lolos.
      """
      content2:  k1:"v1\"abc", k2:"v2", k3: "v3"
    • Aturan Transformasi 1

      e_kv("content2",sep=":", quote='"')

      Aturan berikut berlaku untuk fungsi e_kv:

    • Hasil 1

      Log yang diproses adalah sebagai berikut:

      content2:  k1:"v1\"abc", k2:"v2", k3: "v3"
      k1: v1\
      k2: v2
      k3: v3
    • Aturan Transformasi 2

      Anda dapat menggunakan parameter escape dari fungsi e_kv untuk dengan benar mengurai nilai yang berisi karakter lolos, seperti garis miring terbalik (\). Sebagai contoh:

      e_kv("content2",sep=":", quote='"',escape=True)
    • Hasil 2

      Log yang diproses adalah sebagai berikut:

      content2:  k1:"v1\"abc", k2:"v2", k3: "v3"
      k1: v1"abc
      k2: v2
      k3: v3
  • Untuk log dalam format a='k1=k2\';k2=k3', fungsi e_kv adalah metode yang paling sesuai untuk mengekstrak nilai. Dua metode lainnya sulit digunakan.

    • Log Mentah

      data: i=c10 a='k1=k2\';k2=k3'
    • Aturan Transformasi 1

      Secara default, parameter escape dari fungsi e_kv adalah `False`. Hasil berikut dikembalikan:

      e_kv("data", quote="'")
    • Hasil 1

      Log yang diproses adalah sebagai berikut:

      a:  k1=k2\
      i:  c10
      k2:  k3
    • Aturan Transformasi 2

      Anda dapat menggunakan parameter escape dari fungsi e_kv untuk dengan benar mengurai nilai yang berisi karakter lolos, seperti garis miring terbalik (\). Sebagai contoh:

      e_kv("data", quote="'", escape=True)
    • Hasil 2

      Log yang diproses adalah sebagai berikut:

      data: i=c10 a='k1=k2\';k2=k3'
      i: c10
      a: k1=k2';k2=k3
  • Transformasi nilai kompleks

    • Log Mentah

      content:  rats eat rice|chicks eat bugs|kittens eat fish|
    • Aturan Transformasi

      Anda dapat menggunakan fungsi e_regex untuk mentransformasi nilai.

      e_regex("content", r"\b(\w+) eat ([^\|]+)", {r"\1": r"\2 by \1"})
    • Hasil

      Log yang diproses adalah sebagai berikut:

      content:  rats eat rice|chicks eat bugs|kittens eat fish|
      kittens:  fish by kittens
      chicks:  bugs by chicks
      rats:  rice by rats

Kasus penggunaan pelanggan

Bab ini memberikan kasus penggunaan di mana Anda perlu mengekstrak data dari URL dalam log situs web. Anda dapat merancang aturan transformasi untuk memproses log sesuai dengan kebutuhan Anda.

  • Transformasi Awal

    • Persyaratan

      • Persyaratan 1: Parsing log untuk mengekstrak bidang seperti proto, domain, dan param.

      • Persyaratan 2: Perluas pasangan kunci-nilai dalam bidang param.

    • Log Mentah

      __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
    • Metode Transformasi

      • Aturan Keseluruhan

        # Pertama, parsing konten permintaan.
        e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)?@)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?"))
        # Selanjutnya, parsing uri_param.
        e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\?%{GREEDYDATA:uri_query}"))
        # Perluas pasangan kunci-nilai.
        e_kv("uri_query")
      • Aturan Spesifik dan Hasilnya

        1. Anda dapat menggunakan pola GROK untuk mengurai bidang request.

          Anda juga dapat menggunakan ekspresi reguler untuk mengurai bidang tersebut. Untuk informasi lebih lanjut, lihat Fungsi GROK dan Pola GROK.

          e_regex('request',grok("%{URIPROTO:uri_proto}://(?:%{USER:user}(?::[^@]*)?@)?(?:%{URIHOST:uri_domain})?(?:%{URIPATHPARAM:uri_param})?"))

          Hasil:

          uri_domain:  example.com
          uri_param:  /video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0
          uri_proto:  https
        2. Anda dapat menggunakan pola GROK untuk mengurai bidang uri_param.

          e_regex('uri_param',grok("%{GREEDYDATA:uri_path}\?%{GREEDYDATA:uri_query}"))

          Hasil pemrosesan:

          uri_path:  /video/getlist/s
          uri_query:  ver=3.2.3&app_type=supplier&os=Android8.1.0
        3. Anda dapat mengekstrak bidang dari uri_param, sebagai berikut:

          e_kv("uri_query")

          Hasil pemrosesan:

          app_type:  supplier
          os:  Android8.1.0
          ver:  3.2.3
  • Hasil

    Pratinjau log yang diproses:

    __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

    Jika Anda hanya perlu mengurai bidang request, Anda dapat langsung menggunakan fungsi e_kv. Sebagai contoh:

    e_kv("request")

    Pratinjau log yang diproses:

    __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
  • Transformasi Lebih Lanjut

    Untuk mengekstrak bidang dinamis seperti ver, app_type, dan os, Anda dapat menggunakan aturan transformasi berikut.

    • Gunakan ekspresi reguler

      e_regex("url", r"\b(\w+)=([^=&]+)", {r"\1": r"\2"})
    • Gunakan fungsi e_kv_delimit

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

    Anda dapat menggunakan fungsi yang dijelaskan dalam topik ini untuk mengurai sebagian besar format URL. Namun, untuk format URL dalam contoh ini, fungsi e_kv sudah cukup karena menyediakan solusi yang jelas dan sederhana.