基礎(chǔ)語法
本文介紹SLS DSL的基礎(chǔ)語法。
注釋
對(duì)語法進(jìn)行解釋說明,需要以井號(hào)(#)開頭。示例如下:
#設(shè)置日志的默認(rèn)主題(放在行首的注釋)。
e_set("__topic__", "access_log") #設(shè)置日志的默認(rèn)主題(放在行尾的注釋)。
換行
函數(shù)調(diào)用的參數(shù)列表過長時(shí),需要換行。
如果函數(shù)結(jié)構(gòu)中存在半角逗號(hào)(,),可以直接在半角逗號(hào)(,)的地方進(jìn)行換行。
如果某個(gè)字符串過長需要換行,可以使用反斜線(\)換行。
示例如下:
e_set("__topic__", "v1",
"type", "v2", #使用半角逗號(hào)(,)分隔時(shí),直接換行。
"length", 100)
e_set("__topic__", "this is a very long long long .........." \
"......long text") #使用反斜線(\)換行。
函數(shù)調(diào)用方式
基本調(diào)用方式
e_set("abc", "xyz")
說明編寫數(shù)據(jù)加工語句時(shí),傳入?yún)?shù)類型和數(shù)量需要與函數(shù)語法匹配。
基本變參調(diào)用
str_replace(值, old [,new [,count] ])
說明函數(shù)參數(shù)中包含如上形式的方括號(hào)([])時(shí),其參數(shù)例如
new
和count
比較特殊,屬于可選參數(shù),但不能使用命名參數(shù)形式調(diào)用且只能順序調(diào)用。#錯(cuò)誤示例 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)
命名參數(shù)調(diào)用方式
有默認(rèn)值的參數(shù)叫做命名參數(shù),例如
e_set("abc", "xyz", mode="fill")
中的mode
。某些函數(shù)的命名參數(shù)在特定條件下必須傳入值,具體請(qǐng)參見每個(gè)函數(shù)的參數(shù)說明。
傳遞參數(shù)值的方式為:
mode=...
。有多個(gè)命名參數(shù)時(shí),對(duì)傳遞順序沒有嚴(yán)格要求,例如
e_csv("data", ["f1", "f2", "f3"], sep='#', quote="|")
和e_csv("data", ["f1", "f2", "f3"], quote="|", sep='#')
相同。
說明在函數(shù)中,命名參數(shù)始終排在非命名參數(shù)的后面。
組合調(diào)用
將函數(shù)的返回值作為其他函數(shù)參數(shù)的取值,需要確保兩個(gè)數(shù)據(jù)的數(shù)據(jù)類型一致。例如:
e_set("abc", v("xyz")) e_set("abc", str_lower(v("xyz")))
變參
某些函數(shù)支持變參傳遞。
v("f1", ....)
表示可以傳遞更多參數(shù),例如v("f1", "f2", "f3")
。傳入命名參數(shù)時(shí),命名參數(shù)需要放在最后,例如
v("f1", "f2", "f3", "f4", mode="fill")
。
操作符
比較運(yùn)算符
SLS DSL標(biāo)準(zhǔn)模式支持大小比較運(yùn)算符,包括
>、<、>=、<=、!=、==
。您也可以使用日志服務(wù)提供的比較運(yùn)算函數(shù)來實(shí)現(xiàn)相同效果。直接使用比較運(yùn)算符
#下面是一些使用樣例,當(dāng)大小比較結(jié)果為True時(shí),丟棄日志。 e_if(3 > 2, DROP) # 3大于2時(shí),丟棄。 e_if(3 < 2, DROP) # 3小于2時(shí),丟棄。 e_if(3 >= 2, DROP) # 3大于等于2時(shí),丟棄。 e_if(3 <= 2, DROP) # 3小于等于2時(shí),丟棄。 e_if(3 == 2, DROP) # 3等于2時(shí),丟棄。 e_if(3 != 2, DROP) # 3不等于2時(shí),丟棄。 e_if(1 < 2 < 3, DROP) # 2大于1且2小于3時(shí),丟棄。 e_if(0 < ct_int(v('x')) < 100, DROP) # 字段x的值大于0且小于100時(shí),丟棄。
使用日志服務(wù)提供的比較運(yùn)算函數(shù)
場(chǎng)景操作
函數(shù)
示例
判斷等于
==
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)
邏輯運(yùn)算符
SLS DSL標(biāo)準(zhǔn)模式支持邏輯運(yùn)算符,包括and、or和not。您也可以使用日志服務(wù)提供的邏輯運(yùn)算函數(shù)來實(shí)現(xiàn)相同效果。
直接使用邏輯運(yùn)算符
#下面是一些使用樣例,當(dāng)邏輯運(yùn)算的結(jié)果為True時(shí),丟棄日志。 e_if(True and False, DROP) # 結(jié)果為False e_if(True or False, DROP) # 結(jié)果為True e_if(True and not False, DROP) # 結(jié)果為True e_if(3 > 2 and 1 < 3, DROP) # 結(jié)果為True e_if(ct_int(v('x')) > 100 or ct_int(v('y')) < 100, DROP) # 字段x的值大于100或者字段y的值小于100
使用日志服務(wù)提供的邏輯運(yùn)算函數(shù)
場(chǎng)景操作
函數(shù)
示例
邏輯且
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標(biāo)準(zhǔn)模式下不直接支持以下操作符。日志服務(wù)提供對(duì)應(yīng)的函數(shù)來實(shí)現(xiàn)相同的效果。
場(chǎng)景操作
函數(shù)
示例
加
+
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)
取負(fù)
-
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)
例如設(shè)置字段
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)) #合法
真假判斷
有些函數(shù)會(huì)接收條件,根據(jù)條件的值來決定事件的邏輯。條件可以是一個(gè)固定值或者表達(dá)式返回的值。
SLS DSL支持對(duì)任意類型值進(jìn)行判斷,如下表格是各種類型值的真假條件。
數(shù)據(jù)類型 | True的條件 | False的條件 |
布爾 | True,true | False,false |
None | 無 | 總是False |
數(shù)值 | 非0或非0.0 | 0或0.0 |
字符串 | 非空 | 空串 |
字節(jié) | 非空 | 空字節(jié) |
元組 | 非空 | 空元組 |
列表 | 非空 | 空列表 |
字典 | 非空 | 空字典 |
表格 | 存在即為True | 空對(duì)象(None) |
日期時(shí)間 | 存在即為True | 空對(duì)象(None) |
如下為丟棄事件示例:
e_if(True, DROP) #輸入True時(shí),丟棄。
e_if(1, DROP) #輸入1時(shí),丟棄。
e_if(v("abc"), DROP) #存在字段abc且字段不為空時(shí),丟棄。
e_if(str_isdigit(v("abc")), DROP) #存在字段abc且字段的內(nèi)容都是數(shù)字時(shí),丟棄。