全部产品
Search
文档中心

Simple Log Service:Mengolah data dengan memanggil fungsi

更新时间:Nov 09, 2025

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: twiss
  • Aturan 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 : 2
    • Aturan 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:5
    • Aturan 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:00
    • Aturan 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.

Penting

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: 1024
  • Aturan 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: 404
  • Fungsi 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"
    }