本文档介绍LOG 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] ]) 
    说明 函数参数中包含如上形式的中括号时,其参数例如newcount比较特别属于可选参数,但是又不能用命名参数形式调用。
    # 如下错误
    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")

操作符

由于LOG 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_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))    # 合法

真假判断

有些函数会接收条件,根据条件的值来决定时间的逻辑。条件可以是一个固定值或者表达式返回的值。

LOG DSL的条件判断支持对任意类型值进行判断,如下表格是各种类型值的真假条件:
数据类型 True的条件 False的条件
布尔 True,true False,false
None - 总是False
数值 非0或非0.0 0或0.0
字符串 非空 空串
字节 非空 空字节
元组 非空 空元组
列表 非空 空列表
字典 非空 空字典
表格 存在即为True 空对象(None)
日期时间 存在即为True 空对象(None)
如下为丢弃事件示例:
e_if(True, DROP)      # 总是
e_if(1, DROP)       # 总是
e_if(v("abc"), DROP)      # 存在字段abc, 且字段不为空时
e_if(str_isdigit(v("abc")), DROP) # 存在字段abc, 且字段的内容都是数字时