全部產品
Search
文件中心

Simple Log Service:基礎文法

更新時間:Aug 29, 2025

本文介紹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] ]) 
    說明

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

    #錯誤樣本
    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且欄位的內容都是數字時,丟棄。