全部產品
Search
文件中心

Simple Log Service:基礎文法

更新時間:Jul 26, 2024

本文介紹SLS DSL的基礎文法。

注釋

對文法進行解釋說明,需要以井號(#)開頭。樣本如下:

#設定日誌的預設主題(放在行首的注釋)。
e_set("__topic__", "access_log")   #設定日誌的預設主題(放在行尾的注釋)。

換行

函數調用的參數列表過長時,需要換行。

  • 如果函數結構中存在半形逗號(,),可以直接在半形逗號(,)的地方進行換行。

  • 如果某個字串過長需要換行,可以使用反斜線(\)換行。

樣本如下:

e_set("__topic__", "v1",
        "type", "v2",       #使用半形逗號(,)分隔時,直接換行。
        "length", 100)
e_set("__topic__", "this is a very long long long .........." \
                            "......long text")  #使用反斜線(\)換行。

函數調用方式

  • 基本調用方式

    e_set("abc", "xyz")
    說明

    編寫資料加工語句時,傳入參數類型和數量需要與函數文法匹配。

  • 基本變參調用

    str_replace(值, old [,new [,count] ]) 
    說明

    函數參數中包含如上形式的方括弧([])時,其參數例如newcount比較特殊,屬於選擇性參數,但不能使用具名引數形式調用且只能順序調用。

    #錯誤樣本
    str_replace("a-b-c", "-", new='%')
    str_replace("a-b-c", "-", new='%', count=1)
    #正確樣本
    str_replace("a-b-c", "-", '%')
    str_replace("a-b-c", "-", '%', 2)
  • 具名引數調用方式

    有預設值的參數叫做具名引數,例如e_set("abc", "xyz", mode="fill")中的mode

    • 某些函數的具名引數在特定條件下必須傳入值,具體請參見每個函數的參數說明。

    • 傳遞參數值的方式為:mode=...

    • 有多個具名引數時,對行程順序沒有嚴格要求,例如e_csv("data", ["f1", "f2", "f3"], sep='#', quote="|")e_csv("data", ["f1", "f2", "f3"], quote="|", sep='#')相同。

    說明

    在函數中,具名引數始終排在非具名引數的後面。

  • 組合調用

    將函數的傳回值作為其他函數參數的取值,需要確保兩個資料的資料類型一致。例如:

    e_set("abc", v("xyz"))
    e_set("abc", str_lower(v("xyz")))
  • 變參

    某些函數支援變參傳遞。v("f1", ....)表示可以傳遞更多參數,例如v("f1", "f2", "f3")

    傳入具名引數時,具名引數需要放在最後,例如v("f1", "f2", "f3", "f4", mode="fill")

操作符

  • 比較子

    SLS DSL標準模式支援大小比較子,包括>、<、>=、<=、!=、==。您也可以使用Log Service提供的比較運算函數來實現相同效果。

    • 直接使用比較子

      #下面是一些使用範例,當大小比較結果為True時,丟棄日誌。
      e_if(3 > 2, DROP)       # 3大於2時,丟棄。
      e_if(3 < 2, DROP)       # 3小於2時,丟棄。
      e_if(3 >= 2, DROP)      # 3大於等於2時,丟棄。
      e_if(3 <= 2, DROP)      # 3小於等於2時,丟棄。
      e_if(3 == 2, DROP)      # 3等於2時,丟棄。
      e_if(3 != 2, DROP)      # 3不等於2時,丟棄。
      e_if(1 < 2 < 3, DROP)   # 2大於1且2小於3時,丟棄。
      e_if(0 < ct_int(v('x')) < 100, DROP) # 欄位x的值大於0且小於100時,丟棄。
    • 使用Log Service提供的比較運算函數

      情境操作

      函數

      樣本

      判斷等於==

      op_eq

      op_eq(v("name"), "xiao ming")

      判斷不等於!=

      op_ne

      op_ne(v("name"), "xiao ming")

      大於>

      op_gt

      op_gt(ct_int(v("age")), )

      大於等於>=

      op_ge

      op_ge(ct_int(v("age")), 18)

      小於<

      op_lt

      op_lt(ct_int(v("age")), 18)

      小於等於<=

      op_le

      op_le(ct_int(v("age")), 18)

  • 邏輯運算子

    SLS DSL標準模式支援邏輯運算子,包括and、or和not。您也可以使用Log Service提供的邏輯運算函數來實現相同效果。

    • 直接使用邏輯運算子

      #下面是一些使用範例,當邏輯運算的結果為True時,丟棄日誌。
      e_if(True and False, DROP)     # 結果為False
      e_if(True or False, DROP)      # 結果為True
      e_if(True and not False, DROP) # 結果為True
      e_if(3 > 2 and 1 < 3, DROP)    # 結果為True
      e_if(ct_int(v('x')) > 100 or ct_int(v('y')) < 100, DROP) # 欄位x的值大於100或者欄位y的值小於100
    • 使用Log Service提供的邏輯運算函數

      情境操作

      函數

      樣本

      邏輯且and

      op_and

      op_and(op_gt(v("age"), 18), op_lt(v("age"), 31))

      邏輯或or

      op_or

      op_or(op_le(v("age"), 18), op_gt(v("age"), 65))

      邏輯否not

      op_not

      op_not(op_gt(v("age"), 18))

  • 其他動作符

    由於SLS DSL標準模式下不直接支援以下操作符。Log Service提供對應的函數來實現相同的效果。

    情境操作

    函數

    樣本

    +

    op_add

    op_add(v("age"), 2)

    -

    op_sub

    op_sub(v("age"), 2)

    *

    op_mul

    op_mul(v("size"), 2)

    **

    op_pow

    op_pow(v("size"), 2)

    整除//

    op_div_floor

    op_div_floor(v("bytes"), 1024)

    模數%

    op_mod

    op_mod(v("age"), 10)

    取負-

    op_neg

    op_neg(v("profit"))

    判斷存在in

    op_in

    op_in(["pass", "ok"], v("result"))

    判斷不存在not in

    op_not_in

    op_not_in(["pass", "ok"], v("result"))

    字串切片[ ...]

    op_slice

    op_slice(v("message"), 0, 20)

    例如設定欄位a的值為3600*6

    # * 
    e_set("a", 3600 * 6)           #非法
    e_set("a", op_mul(3600, 6))    #合法
    
    # /
    e_set("bytes_kb", v("bytes") / 1024)                 #非法
    e_set("bytes_kb", op_div_floor(v("bytes"), 1024))    #合法

真假判斷

有些函數會接收條件,根據條件的值來決定事件的邏輯。條件可以是一個固定值或者運算式返回的值。

SLS DSL支援對任意類型值進行判斷,如下表格是各種類型值的真假條件。

資料類型

True的條件

False的條件

布爾

True,true

False,false

None

總是False

數值

非0或非0.0

0或0.0

字串

非空

空串

位元組

非空

空位元組

元組

非空

空元組

列表

非空

空列表

字典

非空

空字典

表格

存在即為True

Null 物件(None)

日期時間

存在即為True

Null 物件(None)

如下為丟棄事件樣本:

e_if(True, DROP)                     #輸入True時,丟棄。
e_if(1, DROP)                        #輸入1時,丟棄。
e_if(v("abc"), DROP)                 #存在欄位abc且欄位不為空白時,丟棄。
e_if(str_isdigit(v("abc")), DROP)    #存在欄位abc且欄位的內容都是數字時,丟棄。