本文介紹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且欄位的內容都是數字時,丟棄。