日志服务语言(LOG DSL)通过提供不同类型的函数,满足用户在不同场景下对日志数据加工处理的需求。
语言模式
- 标准模式:默认为该模式,可视为Python的子集。除基本的数据结构与表达方式外,语法规则是以函数方式进行编排。
- 白名单高级模式:功能上完全兼容Python。如果需要使用白名单高级模式,请提工单申请。
类别 | Python语法 | 标准模式 | 白名单高级模式 |
---|---|---|---|
数据结构 | 数字、字符串、布尔 | 支持,除""" 形式字符串不支持。
|
支持 |
元组、列表、集合、字典 | 支持,除集合set 如{1,2,3} 不支持。
|
支持 | |
对象定义 | 仅支持内置扩展数据结构,如表格、日期时间对象等。 | 支持 | |
基本语法 | 操作符,如加减乘除等 | 不直接支持,需要通过函数支持。 | 支持 |
注释 | 支持。 | 支持 | |
变量定义赋值 | 不支持,需使用函数调用传递。 | 支持 | |
条件、循环 | 不直接支持,需要通过内置函数实现。 | - | |
函数 | 标准Python内置函数 | 不支持。使用200+内置函数。 | 支持 |
函数调用 | 支持,除解包调用不支持。 | 支持 | |
自定义函数def或lambda | 不支持,提供两百多个事件与表达式函数,且支持基于现有函数的自由组合调用。 | 支持 | |
模块 | 导入与使用Python标准库 | 不支持。 | 支持 |
线程与进程创建 | 不支持。 | 支持 | |
导入第三方库 | 不支持。 | 提工单申请 | |
外部网络连接或命令调用 | 提供内置的资源连接器。 | 提工单申请 |
函数分类
- 全局操作函数
主要用来接收事件,处理并返回事件的函数。且只有全局操作函数才能构建加工规则的每个步骤。
- 表达式函数
通用型函数,接受特定参数,组合调用后作为参数传递给全局操作函数以定义更加灵活的逻辑。
函数类型 | 全局步骤 | 接收 | 返回 | 修改事件 | 组合调用 |
---|---|---|---|---|---|
全局操作函数 | 支持 | 自动接收事件 | 0到多条事件 | 支持大部分情况 | 支持 |
表达式函数 | 不支持 | 除个别函数支持,大部分不直接处理事件。 | 特定数据结构 | 不支持 | 支持 |
全局操作函数
全局函数1(..参数....)
全局函数2(..参数....)
全局函数3(..参数....)
全局函数4(..参数....)
全局操作函数可以分为两类:
函数分类 | 描述 | 样例 |
---|---|---|
流程控制函数 | 用于步骤流程控制,接收事件,基于条件控制调用其他事件函数完成事件处理。 | e_if 、e_switch 、e_if_else 等。
|
事件处理函数 | 对事件进行加工的函数 。返回0到多条事件。 | 函数样例如下:
|
- 基本处理:
数据加工会以流式方式读取源Logstore的数据,并将每一条日志事件以字典的数据结构传递给加工规则,然后根据加工规则中定义的事件函数顺序处理日志数据,并将最终的数据加工结果输出到默认的Logstore。说明 在传递的过程中事件的字段和值始终都是字符串形式。例如:原事件是
{"__time__": "1234567", "__topic__": "", "k1": "test"}
,函数e_set("f1", 200)
设置字段f1
的值为200,经过这个函数处理后,原事件会变成:{"__time__": "1234567", "__topic__": "", "k1": "test", "f1": "200"}
,其中f1
和200都是字符串类型。规则中定义的每个事件函数会顺序执行,每个函数会对每个事件处理和修改,最后返回修改后的事件。
例如
e_set("type", "test")
会对每个事件添加一个字段type
,值为test,下一个函数接收到的就是修改后的事件。 - 条件判断:
- 条件判断e_if:某些事件可以增加条件判断,不满足条件的事件就会跳过本次操作,相当于一个
if
的逻辑。例如
e_if(e_match("status", "200"), e_regex("data", "ret: \d+", "result"))
,会首先判断字段status
是否为200,如果条件判断为真,则会对字段data
用正则表达式提取出新字段result
;如果条件判断为否,则不会执行任何操作。 e_if_else
:与if_else
操作类似。
- 条件判断e_if:某些事件可以增加条件判断,不满足条件的事件就会跳过本次操作,相当于一个
- 停止处理:
- 某些步骤可能返回0个事件,表示删除事件。
例如
e_if(str_islower(v("result")), e_drop())
,如果每个result
字段的值是小写字符串,则丢弃这条事件,后续的操作将不再进行,自动重新开始下一条事件。 - 输出事件可以视为一种特殊的停止处理,例如
e_output
提前输出事件到目标并删除事件,其后续的操作也不会再进行。说明 函数e_coutput
会复制一份当前的事件输出,并继续处理后续。
- 某些步骤可能返回0个事件,表示删除事件。
- 分裂并行:
某些步骤也可能返回多个事件,表示分裂事件。
例如
e_split(data)
,表示根据字段data
的值将原本的一条事件分裂成两条事件。假如data
的值是"abc, xyz"
,则分裂后两条事件字段data
的值分别是abc和xyz。分裂后的每条事件都会继续进行后续的步骤。
表达式函数
全局操作1(表达式函数1(...), ....)
全局操作2(..., 表达式函数2(...), 表达式函数3(...),...)
表达式函数大概可以分为四类:
函数分类 | 描述 | 样例 |
---|---|---|
事件检查函数 | 接收事件,提取或检索返回特定信息的函数,不会修改传递的事件。 | 函数v 返回事件字段的值。函数e_search 和e_match 返回事件是否符合特定的条件。
|
资源函数 | 连接本地或外部资源,接收特定参数配置并返回数据,一般是字典、表格等类型。 | OSS、RDS、Logstore资源函数。 |
控制函数 | 用于表达式的逻辑操作,接收特定参数并基于条件做控制,调用其他表达式函数返回结果。 | op_and 、op_or 、op_not 、op_if 、op_coalesce 等。
|
其他表达式函数 | 接受固定或者其他函数的调用结果,返回特定的值。 | 字符串、时间、类型转换函数等。 |