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, ataue_regexuntuk 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__=3Aturan 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: 2CatatanKata 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__=3Aturan 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__=3Aturan 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:v3menggunakan ekspresi reguler tertentu.Fungsi e_kv
Log Mentah
content:k1=v1&k2=v2?k3:v3Aturan Transformasi
e_kv("content",sep="(?:=|:)")Hasil
content:k1=v1&k2=v2?k3:v3 k1: v1 k2: v2 k3: v3CatatanSaat melewatkan set karakter ke parameter
pair_sep,kv_sep, atausep, gunakan grup non-mengambil dalam format(?:Set karakter).
Fungsi e_kv_delimit
Log Mentah
content:k1=v1&k2=v2?k3:v3Aturan 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:v3Aturan 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_regexlebih nyaman digunakan.Log Mentah
content :"key1:"value1,"key2:"value2Aturan Transformasi
Jika kata kunci didahului oleh tanda kutip ganda ("), Anda dapat menggunakan fungsi
e_regexuntuk 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=bataua="cxxx", Anda dapat menggunakan fungsie_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 formatcontent:k1="v1=1"&k2=v2?k3=v3, Anda dapat menggunakan fungsie_kvuntuk mengekstrak nilai. Sebagai contoh:Log Mentah
content:k1="v1=1"&k2=v2?k3=v3Aturan 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_delimitdengan aturane_kv_delimit("ctx", pair_sep=r"&?", kv_sep="="), hanyak2: v2dank3: v3yang dapat diurai. Ini karena kata kunci dalam pasangan kunci-nilai pertama yang diekstrak adalahk1="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, oilAturan Transformasi (Tidak Disarankan)
Fungsi
e_kvtidak 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_kvdane_kv_delimituntuk mentransformasi (kunci) dan nilai dengan menyetel parameterprefix="", suffix="".Log Mentah
k1: q=asd&a=1&b=2Aturan 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_regexmenyediakan 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 fungsie_kvuntuk 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: v3Aturan Transformasi 2
Anda dapat menggunakan parameter
escapedari fungsie_kvuntuk 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', fungsie_kvadalah 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
escapedari fungsie_kvadalah `False`. Hasil berikut dikembalikan:e_kv("data", quote="'")Hasil 1
Log yang diproses adalah sebagai berikut:
a: k1=k2\ i: c10 k2: k3Aturan Transformasi 2
Anda dapat menggunakan parameter
escapedari fungsie_kvuntuk 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_regexuntuk 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, danparam.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.0Metode 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
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: httpsAnda 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.0Anda 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.3Jika 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.3Transformasi Lebih Lanjut
Untuk mengekstrak bidang dinamis seperti
ver,app_type, danos, Anda dapat menggunakan aturan transformasi berikut.Gunakan ekspresi reguler
e_regex("url", r"\b(\w+)=([^=&]+)", {r"\1": r"\2"})Gunakan fungsi
e_kv_delimite_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_kvsudah cukup karena menyediakan solusi yang jelas dan sederhana.