本文档介绍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")
。
操作符
场景操作 | 函数 | 示例 |
---|---|---|
加+ |
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")) |
逻辑且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)) |
判断等于== |
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) |
字符串切片[ ...] |
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)) #合法
真假判断
有些函数会接收条件,根据条件的值来决定事件的逻辑。条件可以是一个固定值或者表达式返回的值。
数据类型 | True的条件 | False的条件 |
---|---|---|
布尔 | True,true | False,false |
None | 无 | 总是False |
数值 | 非0或非0.0 | 0或0.0 |
字符串 | 非空 | 空串 |
字节 | 非空 | 空字节 |
元组 | 非空 | 空元组 |
列表 | 非空 | 空列表 |
字典 | 非空 | 空字典 |
表格 | 存在即为True | 空对象(None) |
日期时间 | 存在即为True | 空对象(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且字段的内容都是数字时,丢弃。