语法简介: https://help.aliyun.com/document_detail/129376.html (这个非常的重要,下面的所有语法都是基于这个演变)

函数总览:  https://help.aliyun.com/document_detail/159702.html

函数参考:  https://help.aliyun.com/document_detail/129391.html


对比C#

对比c#dsl
字符串换行var xxx = "这是一段很长" +
               "长";
e_set("__topic__", "this is a very long long long .........." \  #使用反斜线(\)换行。
                           "......long text")
注释// 单行
/*
多行
*/
# 这是注释
方法跟c#大同小异
使用小括号
可使用命名参数 ,如 e_csv("data", ["f1", "f2", "f3"], sep='#', quote="|")
逻辑运算符&  |  ! 与或非and  or  not  跟sql类似
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_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))    #合法

函数命名理解

使用下划线分隔

大部分函数根据前段进行识别分类

  • e_全局操作函数,如 e_if,e_if_else, e_keep, e_drop
  • op_操作符函数 ,operate
  • ct_转换函数,conver to
  • mat_算数函数,math
  • str_字符串函数  string
  • dt_日期函数,datetime
  • regex_正则函数
  • json_json函数
  • xml_xml函数
  • ip_ip函数
  • lst_列表函数
  • dct_字典函数
  • tab_表格函数
  • ... 更多按经验调用

函数v()

取值的意思,取某个字段的值,  v 指 value

函数的使用

首先一切皆函数,所以这里只能使用函数的方式来使用,也就是传参的形式,传参也就是已逗号分隔

例如e_switch,下面涉及到两个函数的定义,一是变参,二是命名参数

变参在c#的表述是params ,如  Abc(params string[] args)

命名参数是有默认值  如  e_switch(params string[] args, string default="")

e_switch(
    e_has("a"), e_output("target-a"), 
    e_has("b"), e_output("target-b"),
    default=e_output("target-default"),
)

怎么表述c#中的大括号?使用e_compose

if( age < 10 )
{
   // 免费乘车
   // 不能玩大型机动游戏
}

在dsl中只能使用e_compose,因为函数的调用只能是参数形式,借助e_compose

e_if(
    e_search("content==123"),
    e_compose(e_drop_fields("age|name"), e_rename("content", "ctx")),
)

全局操作函数的理解差异

c#dsl
switch判断语句,形如
if(xx=="a"){}
else if(xx=='b'){}
else if(xx=="c"){}
else {}
在这里是表述为多操作语句,形如
if(xx=="a"){}
if(yy=="b"){}
if(zz=="c"){}
split对当前对象进行分割,一般是字符串对当前日志进行分割,这里注意,分割出来时除被分割的字段外,还会包括当前日志项的其他数据
例如,
__topic__:  1,2
name: abc
将分裂出
__topic__:  1
name: abc
以及
__topic__:  2
name: abc

关于e_output、e_coutput的区别

e_output:输出日志到指定的Logstore中,且对应的日志不再执行后面的加工规则。

e_coutput:输出日志到指定的Logstore中,且对应的日志继续执行后面的加工规则