Gunakan fungsi transformasi data Simple Log Service (SLS) untuk membersihkan volume besar data log yang dikumpulkan dan menstandarkan format data. Topik ini menjelaskan kasus penggunaan umum serta operasi terkait untuk membersihkan data dengan memanggil fungsi.
Kasus penggunaan 1: Menyaring log (fungsi e_keep dan e_drop)
Gunakan fungsi e_drop atau e_keep untuk menyaring log. Anda juga dapat menggunakan fungsi e_if atau e_if_else dengan parameter DROP untuk menyaring log.
Aturan umum adalah sebagai berikut:
e_keep(e_search(...)): Menyimpan log jika kondisi terpenuhi. Menghapus log jika kondisi tidak terpenuhi.e_drop(e_search(...)): Menghapus log jika kondisi terpenuhi. Menyimpan log jika kondisi tidak terpenuhi.e_if_else(e_search("..."), KEEP, DROP): Menyimpan log jika kondisi terpenuhi. Menghapus log jika kondisi tidak terpenuhi.e_if(e_search("not ..."), DROP): Menghapus log jika kondisi terpenuhi. Menyimpan log jika kondisi tidak terpenuhi.e_if(e_search("..."), KEEP): Ini adalah aturan transformasi yang tidak bermakna.
Contoh:
Log Mentah
#Log 1 __source__: 192.168.0.1 __tag__:__client_ip__: 192.168.0.2 __tag__:__receive_time__: 1597214851 __topic__: app class: test_case id: 7992 test_string: <function test1 at 0x1027401e0> #Log 2 __source__: 192.168.0.1 class: produce_case id: 7990 test_string: <function test1 at 0x1020401e0>Aturan transformasi
Hapus log yang tidak memiliki bidang __topic__ atau bidang __tag__:__receive_time__.
e_if(e_not_has("__topic__"),e_drop()) e_if(e_not_has("__tag__:__receive_time__"),e_drop())Hasil Transformasi
__source__: 192.168.0.1 __tag__:__client_ip__: 192.168.0.2 __tag__:__receive_time__: 1597214851 __topic__: app class: test_case id: 7992 test_string: <function test1 at 0x1027401e0>
Kasus penggunaan 2: Menetapkan nilai ke bidang log kosong (fungsi e_set)
Gunakan fungsi e_set untuk menetapkan nilai ke bidang log kosong.
Tetapkan nilai ke bidang jika bidang aslinya tidak ada atau kosong.
e_set("result", "......value......", mode="fill")Untuk informasi lebih lanjut tentang nilai parameter mode, lihat Mode Pemeriksaan Ekstraksi Bidang dan Penimpaan.
Contoh:
Log mentah
name:Aturan transformasi
e_set("name", "aspara2.0", mode="fill")Hasil Transformasi
name: aspara2.0
Gunakan fungsi GROK untuk menyederhanakan ekspresi reguler dan mengekstrak konten bidang.
Contoh:
Log mentah
content: "ip address: 192.168.1.1"Aturan transformasi
Gunakan fungsi GROK untuk mengekstrak alamat IP dari bidang content.
e_regex("content", grok(r"(%{IP})"),"addr")Hasil Transformasi
addr: 192.168.1.1 content: "ip address: 192.168.1.1"
Tetapkan nilai ke beberapa bidang.
e_set("k1", "v1", "k2", "v2", "k3", "v3", ......)Contoh:
Log mentah
__source__: 192.168.0.1 __topic__: __tag__: __receive_time__: id: 7990 test_string: <function test1 at 0x1020401e0>Aturan transformasi
Tetapkan nilai ke bidang __topic__, __tag__, dan __receive_time__.
e_set("__topic__","app", "__tag__","stu","__receive_time__","1597214851")Hasil Transformasi
__source__: 192.168.0.1 __topic__: app __tag__: stu __receive_time__: 1597214851 id: 7990 test_string: <function test1 at 0x1020401e0>
Kasus penggunaan 3: Menghapus dan mengganti nama bidang secara bersyarat (fungsi e_search, e_rename, dan e_compose)
Dalam banyak kasus, gunakan fungsi e_compose untuk operasi bersyarat berulang.
Contoh:
Log mentah
content: 123 age: 23 name: twissAturan transformasi
Pertama, periksa apakah nilai bidang content adalah 123. Jika ya, hapus bidang age dan name. Kemudian, ganti nama bidang content menjadi ctx.
e_if(e_search("content==123"),e_compose(e_drop_fields("age|name"), e_rename("content", "ctx")))Hasil Transformasi
ctx: 123
Kasus penggunaan 4: Mengonversi tipe parameter log (fungsi v, ct_int, dan dt_totimestamp)
Selama transformasi data, bidang log dan nilainya selalu berupa string. Data tipe non-string secara otomatis dikonversi ke tipe string. Oleh karena itu, saat Anda memanggil fungsi, perhatikan tipe parameter yang diterima oleh fungsi tersebut. Untuk informasi lebih lanjut, lihat Ikhtisar Sintaksis.
Panggil fungsi op_add untuk menggabungkan string dan menambahkan angka.
Fungsi op_add menerima tipe string dan numerik. Oleh karena itu, Anda tidak perlu mengonversi tipe parameter.
Contoh:
Log mentah
a : 1 b : 2Aturan transformasi
e_set("d",op_add(v("a"), v("b"))) e_set("e",op_add(ct_int(v("a")), ct_int(v("b"))))Hasil Transformasi
a:1 b:2 d:12 e:3
Gunakan fungsi operasi bidang dan fungsi ct_int untuk konversi tipe, lalu panggil fungsi op_mul untuk mengalikan angka.
Contoh:
Log mentah
a:2 b:5Aturan transformasi
Nilai v("a") dan v("b") keduanya adalah string. Parameter kedua fungsi op_mul hanya menerima tipe numerik. Oleh karena itu, Anda harus menggunakan fungsi ct_int untuk mengonversi string menjadi integer sebelum melewatkan mereka ke fungsi op_mul.
e_set("c",op_mul(ct_int(v("a")), ct_int(v("b")))) e_set("d",op_mul(v("a"), ct_int(v("b"))))Hasil Transformasi
a: 2 b: 5 c: 10 d: 22222
Panggil fungsi dt_parse dan fungsi dt_parsetimestamp untuk mengonversi string atau objek datetime ke format waktu standar.
Fungsi dt_totimestamp menerima objek datetime, bukan string. Oleh karena itu, Anda harus memanggil fungsi dt_parse untuk mengonversi nilai string dari time1 menjadi objek datetime. Anda juga dapat langsung menggunakan fungsi dt_parsetimestamp, yang menerima objek datetime dan string. Untuk informasi lebih lanjut, lihat Fungsi Tanggal dan Waktu.
Contoh:
Log mentah
time1: 2020-09-17 9:00:00Aturan transformasi
Konversikan waktu yang diwakili oleh time1 menjadi stempel waktu UNIX.
e_set("time1", "2019-06-03 2:41:26") e_set("time2", dt_totimestamp(dt_parse(v("time1")))) or e_set("time2", dt_parsetimestamp(v("time1")))Hasil Transformasi
time1: 2019-06-03 2:41:26 time2: 1559529686
Kasus penggunaan 5: Isi bidang log yang tidak ada dengan nilai default (lewatkan parameter default)
Beberapa fungsi ekspresi DSL SLS memiliki persyaratan tertentu untuk parameter input. Jika persyaratan tidak terpenuhi, jendela transformasi data melaporkan kesalahan atau mengembalikan nilai default. Jika log berisi bidang yang diperlukan tetapi tidak lengkap, tentukan nilai default dalam fungsi op_len.
Melewatkan nilai default ke fungsi berikutnya dapat menyebabkan kesalahan lain. Anda harus menangani pengecualian yang dikembalikan oleh fungsi tersebut dengan segera.
Log mentah
data_len: 1024Aturan transformasi
e_set("data_len", op_len(v("data", default="")))Hasil Transformasi
data: 0 data_len: 0
Kasus penggunaan 6: Memeriksa log secara bersyarat dan menambahkan bidang (fungsi e_if dan e_switch)
Gunakan fungsi e_if atau fungsi e_switch untuk memeriksa log. Untuk informasi lebih lanjut, lihat Fungsi Kontrol Alur.
Fungsi e_if
e_if(condition1, operation1, condition2, operation2, condition3, operation3, ....)Fungsi e_switch
Fungsi e_switch adalah kombinasi pasangan kondisi-operasi. Fungsi ini memeriksa kondisi secara berurutan. Jika kondisi terpenuhi, operasi yang sesuai dilakukan dan hasilnya langsung dikembalikan. Jika kondisi tidak terpenuhi, fungsi memeriksa kondisi berikutnya. Jika tidak ada kondisi yang terpenuhi dan parameter default dikonfigurasi, operasi yang dikonfigurasi untuk default dijalankan dan hasilnya dikembalikan.
e_switch(condition1, operation1, condition2, operation2, condition3, operation3, ...., default=None)
Contoh:
Log mentah
status1: 200 status2: 404Fungsi e_if
Aturan transformasi
e_if(e_match("status1", "200"), e_set("status1_info", "normal"), e_match("status2", "404"), e_set("status2_info", "error"))Hasil Transformasi
status1: 200 status2: 404 status1_info: normal status2_info: error
Fungsi e_switch
Aturan transformasi
e_switch(e_match("status1", "200"), e_set("status1_info", "normal"), e_match("status2", "404"), e_set("status2_info", "error"))Hasil Transformasi
Jika kondisi apa pun terpenuhi, hasilnya dikembalikan, dan tidak ada kondisi lebih lanjut yang diperiksa.
status1: 200 status2: 404 status1_info: normal
Kasus penggunaan 7: Mengonversi data ke stempel waktu UNIX tingkat nanodetik
Dalam beberapa kasus penggunaan, transformasi data di SLS harus mendukung presisi stempel waktu tingkat nanodetik. Jika log mentah berisi bidang dalam format stempel waktu UNIX, gunakan fungsi operasi bidang untuk mengurai stempel waktu log dengan presisi nanodetik.
Log mentah
{ "__source__": "1.2.3.4", "__time__": 1704983810, "__topic__": "test", "log_time_nano":"1705043680630940602" }Aturan transformasi
e_set( "__time__", op_div_floor(ct_int(v("log_time_nano")), 1000000000), ) e_set( "__time_ns_part__", op_mod(ct_int(v("log_time_nano")), 1000000000), )Hasil Transformasi
{ "__source__": "1.2.3.4", "__time__": 1705043680, "__time_ns_part__": 630940602, "__topic__": "test", "log_time_nano":"1705043680630940602" }
Kasus penggunaan 8: Mengonversi data ke stempel waktu ISO 8601 standar tingkat mikrodetik
Dalam beberapa kasus penggunaan, transformasi data di SLS harus mendukung stempel waktu presisi tinggi. Jika log mentah berisi bidang dalam format waktu ISO 8601 standar, gunakan fungsi operasi bidang untuk mengurai stempel waktu log dengan presisi mikrodetik.
Log mentah
{ "__source__": "1.2.3.4", "__time__": 1704983810, "__topic__": "test", "log_time":"2024-01-11 23:10:43.992847200" }Aturan transformasi
e_set( "__time__", dt_parsetimestamp(v("log_time"), tz="Asia/Shanghai"), mode="overwrite", ) e_set("tmp_ms", dt_prop(v("log_time"), "microsecond")) e_set( "__time_ns_part__", op_mul(ct_int(v("tmp_ms")), 1000), )Hasil Transformasi
{ "__source__": "1.2.3.4", "__time__": 1704985843, "__time_ns_part__": 992847000, "__topic__": "test", "log_time": "2024-01-11 23:10:43.992847200", "tmp_ms": "992847" }