本文档介绍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标准模式下不支持操作符,所以日志服务提供了对应的函数来实现相同的效果。
例如设置字段
场景操作 | 函数 | 示例 |
---|---|---|
加+ |
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) |