全部產品
Search
文件中心

Simple Log Service:事件判斷

更新時間:Aug 09, 2024

通過事件判斷可以更好地對符合特定條件的資料進行相應操作,讓加工邏輯更可靠。本文主要介紹使用函數進行事件判斷的常見情境和最佳方案樣本。

情境1:判斷欄位是否存在

  • 原始日誌

    a: a_value
    b:       //Null 字元串
  • SLS DSL編排

    • 方案一(推薦):採用e_hase_not_has

      e_if(e_has("a"),e_set("has_a", true))
      e_if(e_has("b"),e_set("has_b", true))
      e_if(e_has("c"),e_set("has_c", true))
      e_if(e_not_has("a"),e_set("not_has_a", true))
      e_if(e_not_has("b"),e_set("not_has_b", true))
      e_if(e_not_has("c"),e_set("not_has_c", true))
    • 方案二:採用e_search

      e_if(e_search('a: *'),e_set("has_a", true))
      e_if(e_search('b: *'), e_set("has_b", true))
      e_if(e_search('c: *'), e_set("has_c", true))
      e_if(e_search('not a: *'), e_set("not_has_a", true))
      e_if(e_search('not b: *'), e_set("not_has_b", true))
      e_if(e_search('not c: *'), e_set("not_has_c", true))
      說明

      加工規則中的e_if可通過e_if(條件1,操作1,條件2,操作2)的形式合并為一項,此處和本文其他處的拆分是為了方便閱讀。

  • 加工結果

    a:a_value
    b:    //Null 字元串
    has_a: true
    has_b: true
    not_has_c: true

情境2:判斷欄位值是否存在且不為空白

  • 原始日誌

    a: a_value
    b:     // Null 字元串
  • SLS DSL編排

    • 方案一(推薦):採用欄位存取子v

      e_if(v("a"), e_set("not_empty_a", true))
      e_if(v("b"), e_set("not_empty_b", true))
      e_if(v("c"), e_set("not_empty_c", true))
      說明

      欄位存取子v,當對應欄位存在且值不為空白時,其自動轉換的Bool值為true,否則為false

    • 方案二:採用e_search

      #至少一個字元
      e_if(e_search('a: "?"'), e_set("not_empty_a", true))
      e_if(e_search('b: "?"'), e_set("not_empty_b", true))
      e_if(e_search('c: "?"'), e_set("not_empty_c", true))
      
      #正則
      e_if(e_search('a~=".+"'), e_set("not_empty_a", true))
      e_if(e_search('b~=".+"'), e_set("not_empty_b", true))
      e_if(e_search('c~=".+"'), e_set("not_empty_c", true))
      
      #存在且不為空白
      e_if(e_search('a: * and not a==""'), e_set("not_empty_a", true))
      e_if(e_search('b: * and not b==""'), e_set("not_empty_b", true))
      e_if(e_search('c: * and not c==""'), e_set("not_empty_b", true))
  • 加工結果

    a: a_value
    b:     //空串
    not_empty_a: true

情境3:判斷欄位值是否存在且為空白

  • 原始日誌

    a: a_value
    b:       // Null 字元串
  • SLS DSL編排

    • 方案一(推薦):採用欄位存取子v

      e_if(op_and(e_has("a"), op_not(v("a"))), e_set("empty_a", true))
      e_if(op_and(e_has("b"), op_not(v("b"))), e_set("empty_b", true))
      e_if(op_and(e_has("c"), op_not(v("c"))), e_set("empty_c", true))
      
      # 錯誤方案
      e_if(op_not(v("a")), e_set("empty_a", true))
      e_if(op_not(v("b")), e_set("empty_b", true))
      e_if(op_not(v("c")), e_set("empty_c", true))
      說明

      欄位存取子v,當對應欄位存在且值不為空白時,其自動轉換的Bool值為true,否則為false。當值不存在時,其返回trueop_not(None)時也是返回true

    • 方案二:採用e_search

      e_if(e_search('a==""'), e_set("empty_a", true))
      e_if(e_search('b==""'), e_set("empty_b", true))
      e_if(e_search('c==""'), e_set("empty_c", true))
      
      # 錯誤調用
      e_if(e_search('a:""'), e_set("empty_a", true))
      e_if(e_search('b:""'), e_set("empty_b", true))
      說明

      以上錯誤調用中,因函數e_search為部分查詢,欄位存在時,無論其值是否空串,空串a: ""一直為true。

  • 加工結果

    a: a_value
    b:       //Null 字元串
    empty_b: true

情境4:基於欄位值的邏輯查詢判斷

  • 原始日誌

    "日誌1"
    http_host: example.com
    status: 200
    request_method: GET
    scheme: https
    header_length: 700
    body_length: 1200
    
    "日誌2"
    http_host: example.org
    status: 200
    request_method: POST
    scheme: https
    header_length: 100
    body_length: 800
    
    "日誌3"
    http_host: example.net
    status: 200
    request_method: GET
    scheme:  http
    header_length: 700
    body_length: 800
    
    "日誌4"
    http_host: aliyundoc.com
    status: 404
    request_method: GET
    scheme: https
    header_length: 100
    body_length: 300
  • 加工需求1

    為所有status欄位值為200的日誌事件,添加一個新欄位type,其值為normal

    • SLS DSL編排

      e_if(e_match("status", "200"), e_set("type", "normal"))
      或
      e_if(e_search('status==200'), e_set("type", "normal"))
      說明
      • 簡單情境下,以上兩種編排均可。

      • 本文情況下可採用status:200,表示status是否包含200,但推薦使用status==200更精確。

    • 加工結果

      "日誌1"
      type: normal
      http_host: example.com
      status: 200
      request_method: GET
      scheme: https
      header_length: 700
      body_length: 1200
      
      "日誌2"
      type: normal
      http_host: example.org
      status: 200
      request_method: POST
      scheme: https
      header_length: 100
      body_length: 800
      
      "日誌3"
      type: normal
      http_host: example.net
      status: 200
      request_method: GET
      scheme: http
      header_length: 700
      body_length: 800
      
      "日誌4"
      http_host: aliyundoc.com
      status: 404
      request_method: GET
      scheme: https
      header_length: 100
      body_length: 300
  • 加工需求2

    為所有status欄位值為200,且request_method欄位值為GET,且scheme欄位值為https的日誌事件添加一個新欄位type,其值為normal

    • SLS DSL編排

      e_if(e_search('status==200 and request_method==GET and scheme==https'), e_set("type", "normal"))
      或
      e_if(e_match_all("status", "200", "request_method", "GET", "scheme", "https"), e_set("type", "normal"))
      說明
      • 需要同時滿足多個欄位的匹配條件的應用情境中,您可採用e_searche_match_alle_search用法相對簡潔。

      • 本文情況可以採用status: 200,表示status是否包含200,但推薦使用status==200 更精確。

    • 加工結果

      "日誌1"
      type: normal
      http_host: example.com
      status: 200
      request_method: GET
      scheme: https
      header_length: 700
      body_length: 1200
      
      "日誌2"
      http_host: example.org
      status: 200
      request_method: POST
      scheme: https
      header_length: 100
      body_length: 800
      
      "日誌3"
      http_host: example.net
      status: 200
      request_method: GET
      scheme: http
      header_length: 700
      body_length: 800
      
      "日誌4"
      http_host: aliyundoc.com
      status: 404
      request_method: GET
      scheme: https
      header_length: 100
      body_length: 300
  • 加工需求3

    為所有status欄位值為200,或request_method欄位值為GET,或scheme欄位值為https的日誌事件添加一個欄位type,其值為normal

    • SLS DSL編排

      e_if(e_search('status==200 or request_method==GET or scheme==https'), e_set("type", "normal"))
      或者
      e_if(e_match_any("status", "200", "request_method", "GET", "scheme", "https"), e_set("type", "normal"))
    • 加工結果

      "日誌1"
      type: normal
      http_host: example.com
      status: 200
      request_method: GET
      scheme: https
      header_length: 700
      body_length: 100
      
      "日誌2"
      type: normal
      http_host: example.org
      status: 200
      request_method: POST
      scheme: https
      header_length: 100
      body_length: 800
      
      "日誌3"
      type: normal
      http_host: example.net
      status: 200
      request_method: GET
      scheme: http
      header_length: 700
      body_length: 800
      
      "日誌4"
      type: normal
      http_host: aliyundoc.com
      status: 404
      request_method: GET
      scheme: https
      header_length: 100
      body_length: 1300
  • 加工需求4

    為所有status欄位值為200,且request_method欄位值為GET,且header_length,且body_length的欄位值之和小於等於1000的日誌事件,添加一個新欄位type,其值為normal

    • SLS DSL編排

      e_if(op_and(e_search('status: 200 and request_method: GET'), op_le(op_sum(v("header_length"), v("body_length")), 1000)), e_set("type", "normal"))
      說明

      在複雜的邏輯情境下,您可採用e_search和其他運算式函數的組合完成SLS DSL編排。

    • 加工結果

      "日誌1"
      type: normal
      http_host: example.com
      status: 200
      request_method: GET
      scheme: https
      header_length: 700
      body_length: 100
      
      "日誌2"
      http_host: example.org
      status: 200
      request_method: POST
      scheme: https
      header_length: 100
      body_length: 800
      
      "日誌3"
      http_host: example.net
      status: 200
      request_method: GET
      scheme: http
      header_length: 700
      body_length: 800
      
      "日誌4"
      http_host: aliyundoc.com
      status: 404
      request_method: GET
      scheme: https
      header_length: 100
      body_length: 1300