概述
目前数据加工全面支持ETL语言, 更简单灵活. 参考ETL语言介绍
1. 全局操作事件
1.1. 字段赋值(set event)
1.1.1. 语法介绍
语法:
SET_EVENT_新字段 = 固定值
SET_EVENT_新字段 = 表达式函数
说明
- 设置单个字段值,字段名为
新字段
,如果已经存在,则会覆盖现有字段值 -
新字段
的字符约束是:中英文数字_组成,但不能以数字开头。注意:支持中文,但不支持:
,因此不能通过这种方式设置日志的tag
等,可以参考通用操作完成这类需求。 - 表达式函数返回无值
None
时,该操作会被忽略 - 表达式函数返回的任何类型的值都会被转化成字符串(例如,数字会被格式化为字符串,放回到事件中)
- 完整的表达式函数信息,请参考表达式函数
1.1.2. 样例
例子1:设置固定值
添加一个新字段city
值为上海
。
SET_EVENT_city = "上海"
例子2:复制字段值
调用单个表达式函数v
,将现有字段ret
的值,赋值给新字段result
。
SET_EVENT_result = v("ret")
例子3:动态设置值
这里组合调用表达式函数,从字段ret
和return
中首先存在的字段的值,返回其小写赋值给字段result
SET_EVENT_result = str_lower(v("ret", "return"))
1.2. 字段提取 (extract event)
1.2.1. 语法介绍
语法:
EXTRACT_EVENT_字段 = 字符串
EXTRACT_EVENT_字段 = 字段操作类函数
说明
- 对单个
字段
的值进行操作,一般是提取值到多个字段,例如正则表达式、JSON展开、查表富化、键值对拆分等,也包括根据字段值,将一条事件分裂成多条。 - 字符串是字段操作类函数
REGEX
的一种简写。 - 提取的多个值默认会在原字段不存在或者值为空时覆盖,进一步参考提取字段的值检查与覆盖模式
-
字段
的字符约束是:中英文数字_组成,但不能以数字开头。注意:支持中文,但不支持:
,因此不能通过这种方式对日志的tag
等进行操作,可以参考通用操作完成这类需求。 - 表达式函数返回无值
None
时,该操作会被忽略 - 完整的字段类操作函数信息,请参考字段类操作函数
1.2.2. 样例
例子1:正则表达式提取值
从字段email
中提取用户名user
、邮箱司名company
:
EXTRACT_EVENT_email = r"(?P<user>\w+)@(?P<company>\w+)\.com"
注意:字符串是字段操作类函数正则表达式(REGEX
)的简写方式,详情参考其更多使用方法。
例子2:根据字段值映射新字段
根据字段level
的值,调用字段类操作函数LOOKUP
映射出新字段level_info
来:
EXTRACT_EVENT_level = LOOKUP({"1": "info","2": "warning","3": "error", "*": "other"},"level_info")
例子3:展开JSON
根据字段request_body
和response_body
的值,调用字段类操作函数JSON
自动展开(深度默认为10)成多个值:
EXTRACT_EVENT_request_body = JSON
EXTRACT_EVENT_response_body = JSON(depth=1)
不带参数的JSON是简化的调用方式,更多JSON
功能参数,具体参考手册。
1.3. 通用操作
1.3.1. 语法介绍
语法:
TRANSFORM_ANY = 操作
TRANSFORM_ANY = 操作列表
操作
通用操作有三种形式,包含了前面的两种操作的扩展形式,和第三种事件操作类函数
:
字段赋值操作 = {"新字段名": 固定值或表达式函数, "另一个字段名": }
字段提取操作 = 字段输入, 字符串或字段操作类函数
一般操作 = 事件操作类函数
操作列表
多个操作的列表,如[操作1, 操作2, 操作3, ....]
构成的列表,会被依次执行下去,除非某个操作丢弃了事件。
注意:多个操作,必须用[]
括起来。
说明
- 字段赋值操作:是一个
{ key1: value1, key2: value2}
的多个键值对形式,支持多个值的赋值。 - 字段提取操作:是一个
输入, 操作
的单个配对,其中输入
可以不仅仅是一个字段,例如OSSLOOKUP
中支持多个输入做映射。 - 一般操作:覆盖了对事件的常规性操作,例如:丢弃事件、保留或丢弃特定字段等,也包括输出事件等
- 多个通用操作需要使用不同值做
占位符
区分,一般用数字累加即可。 - 完整的事件类操作函数信息,详情参照事件类操作函数详情
1.3.2. 样例
例子1:多个字段赋值操作
对多个字段赋值,也支持表达式函数。
TRANSFORM_ANY = {"__topic__": "default topic", "tag:__type__": v("event_type"), "level": "1"}
例子2:根据字段值提取
根据字段request_body
的值,调用字段类操作函数JSON
展开成多个值:
TRANSFORM_ANY = "request_body", JSON(depth=1)
例子3:一般操作
丢弃事件字段field1
和field2
:
TRANSFORM_ANY = DROP_F(["field1", "field2"])
例子4:多个操作
多个操作按顺序执行:
TRANSFORM_ANY = [ {"email": "abc@default.com"}, ("request_body", JSON) ]
例子4:表达式函数与操作类函数互操作
根据字段字段valid
的值是否为true
来保留或丢弃事件:
TRANSFORM_ANY = op_if(op_eq(v("valid"), "true"), KEEP, DROP)
注意:其中KEEP
和DROP
是保留和丢弃事件类操作的标示。
1.4. 带条件的通用操作
1.4.1. 语法介绍
语法:
TRANSFORM_EVENT = 条件操作
TRANSFORM_EVENT = 条件操作列表
条件操作
就是带条件的通用操作,如果条件满足,即执行其操作,否则无操作。:
条件操作 = 条件, 操作
注意:其中操作
也可以是操作列表
,详情参考操作
条件条件
是用于判断当前事件是否满足特定条件的表达式,其形式有三种:
- 固定条件标识
- {"字段名1", "正则表达式1"}
- {"字段名1", NOT("正则表达式1")} # NOT
- {"字段名1", "正则表达式1", "字段名2": "正则表达式2", ... } # AND
- 表达式函数
- 以上形式的列表,如:[ {"字段名1": "正则表达式1"}, {"字段名2": "正则表达式2"}, ... ] # OR
条件操作的列表
多个条件操作
的列表,如[条件操作1, 条件操作2, 条件操作3, ....]
构成的列表。每次检查每个条件操作
的条件,满足即执行器操作,否则无操作。之后继续检查下一条条件操作
,除非某一步丢弃了事件。
注意:整个列表必须用[]
括起来,其中每个条件操作都需要用()
括起来。
条件语法说明
- 固定条件标识:是使用某些预定义的标识,例如
ANY
、ALL
等都标识所有,也就是任意事件均会匹配并执行后续操作。 -
键值对:
{ key : value }
是对字段值用正则完全匹配,注意,其中的字段的值必须与正则表达式是完全匹配(从头到尾匹配)才能算满足条件。- 例如:字段
user
的值为"i love python", 那么正则表达式"i love"或者"python"均无法匹配。 - 多个键值队的关系是AND关系,必须全满足才能执行配对的操作(列表)。
- 对正则用
NOT
调动后,逻辑关系变成了not
- 例如:字段
- 可以通过
表达式函数
来以返回的值作为判断条件(默认空字符串、None、布尔值False、数字0、空列表等表示不满足,其他情况表示都表示满足。 -
通过对多个逻辑用列表组合,表达了
OR
的意义,也就是只需要有一个满足,即执行配对的操作(列表)- 注意OR、AND、NOT等等逻辑目前版本不能任意嵌套。
- 有复杂逻辑判断的,可以使用
表达式函数
。
- 表达式函数参考表达式函数
1.4.2. 样例
例子1:值匹配后操作
字段result
是failed
或failure
时,设置事件主题为login_failed_event
:
TRANSFORM_EVENT = {"result": r"failed|failure"}, {"__topic__": "login_failed_event"}
例子2:根据字段值判断再提取
当字段request_body
存在且值非空时,调用字段类操作函数JSON
对字段request_body
进行展开成多个值:
TRANSFORM_EVENT = NO_EMPTY("request_body"), ("request_body", JSON)
这里使用了特定表达式函数NO_EMPTY
表示存在字段request_body
且非空。
例子3:高级判断再操作
当字段valid
的值是failed
时,丢弃事件:
TRANSFORM_EVENT = op_if(v("valid"), "failed"), DROP
例子4:多个条件操作
多个操作按顺序执行:
TRANSFORM_EVENT = [
(ANY, {"__topic__": "default_login"}),
( {"valid": "failed"}, {"__topic__": "login_failed_event"} )
]
注意,多个条件操作使用[]
进行括起来,其中每个条件操作,都使用()
括起来。
1.5. 基于条件分派操作
1.5.1. 语法介绍
语法:
DISPATCH_EVENT_占位符 = 条件操作列表
说明
- 形式与待条件的通用操作基本一致
- 其中多个
条件操作
的列表,每次检查每个条件操作
的条件,不满足会持续检查下一个条件操作
,满足即执行器配对的操作(列表),之后就不再执行后续的条件操作
了。
1.5.2. 样例
例子4:条件分派
按照字段http_status
来设置不同的事件主题:
DISPATCH_EVENT = [
({"http_status": r"2\d+"} , {"__topic__": "success_event"}),
({"http_status": r"3\d+"} , {"__topic__": "redirection_event"}),
({"http_status": r"4\d+"} , {"__topic__": "unauthorized_event"}),
({"http_status": r"5\d+"} , {"__topic__": "internal_server_error_event"}),
]
注意,多个条件操作使用[]
进行括起来,其中每个条件操作,都使用()
括起来。
1.6. 常见事件操作的简化宏
1.6.1 保留/丢弃事件
语法
对于满足条件的事件保留或丢弃
KEEP_EVENT = 条件
DROP_EVENT = 条件
说明
- 条件: 与带条件的通用操作中的条件一致,也可以是列表,参考条件
1.6.2 保留/丢弃字段
语法
对于满足条件的字段名保留或丢弃
KEEP_FIELDS = 字符串或字符串列表
DROP_FIELDS = 字符串或字符串列表
字符串或字符串列表
- 字符串:这里的字符串指的是
正则表达式
,当字段名符合条件时保留或者丢弃字符串。 - 列表:表示用
[]
括起来的正则表达式字符串列表,如:["abc", "xyz"]
- 提供了一些预定好的
meta
的字段名的标识,可以直接使用,例如F_TIME
表示时间字段,F_META
表示时间、主题等字段。
说明
- 条件: 与带条件的通用操作中的条件一致,也可以是列表,参考条件
- 因为日志服务中的事件还包含了隐藏的元字段:包括
__time__
、__topic__
等,如果删除了__time__
,那么事件时间将被重置为当前时间,使用KEEP_FIELDS_
时需要特别注意,不要误删。 - 常用
KEEP_FIELDS
格式是:[F_TIME, F_META, F_TAGS, "f1", "f2" ]
1.6.3 重命名字段
语法
RENAME_FIELDS = {"现有字段名正则1": "新字段名1", "现有字段正则2": "新字段名2",}
说明
- 这里的现有字段名实际是一个
正则表达式
,当有多个字段匹配时,所有字段均会改为新字段名,新字段名的值是其中一个,具体哪个未知。则主要解决多种数据源的日志混合时,字段名统一简化用。
1.6.4 输出事件
将满足条件的事件输出
语法
OUTPUT = 条件
COUTPUT = 条件
说明
- 条件: 与带条件的通用操作中的条件一致,也可以是列表,参考条件
-
OUTPUT
将满足条件的事件输出后,事件不再进行后续处理,(可以理解为被丢弃了)。 -
COUTPUT
将满足条件的事件输出后,事件会继续后续处理,(可以理解为复制一份输出了)。 -
事件类操作函数
`OUTPUT与
COUTPUT`支持更多的行为定制。参考事件类操作函数
2. 表达式函数
返回特定值的表达式,一般是单个表达式函数或其调用组合,覆盖如下几大类,100多个并持续增加:
- 基本操作函数: 字段取值, 控制, 比较, 容器判断, 字段存在内容判断,多字段操作等
- 转换函数: 基础类型转换, 数字转换
- 算术函数: 基础计算, 多值计算比较, 数学计算, 数学参数等
- 字符串函数: 多字段操作, 编码/解码, 排序、倒叙、替换, 常规规整, 查找判断, 切分, 格式化, 字符集判断等
- 日期时间函数: 智能日期时间转换, 获取日期时间属性, 获取日期时间, 获取Unix时间戳, 获取日期时间字符串, 修改日期- 时间, 修改日期时间, 比较日期时间等
- 正则表达式函数: 字段提取, 匹配判断, 替换, 切分等
进一步详情,请参考用户手册。
3. 字段类操作函数
基于输入的字段的值,进行操作,注意:目前不支持字段类操作函数与表达式函数互操作。
覆盖如下几大类,并持续增加:
- 正则提取列:正则的完整支持,包括动态提取字段名等
- CSV格式提取:CSV标准的支持
- 字典映射:直接字段映射
- 外部OSS多列映射:从外部OSS上的CSV关联对数据进行富化,支持增量刷新、宽匹配等。
- 外部数据库多列映射:从外部数据库关联对数据进行富化,支持动态刷新、宽匹配等。
- 外部Logstore多列映射:从外部logstore关联对数据进行富化,支持增量刷新、宽匹配等。
- 自动KV:自动提取KV,也支持自定义分隔符、auto-escape场景
- JSON自动展开:支持自动展开JSON内容,包括数组,支持展开过程的定制。
- JSON-JMES过滤:支持基于JMES的动态选择与计算后再处理。
- 分裂事件(基于JSON数组或字符串):基于字符串数组或JSON数组进行事件分裂
- 多列合并(基于JSON数组或字符串):基于字符串数组或JSON数组进行多字段合并
进一步详情,请参考用户手册。
提取字段的值检查与覆盖模式
关键字字符集:
- 执行此策略的方法有:REGEX(动态Key名),JSON、KV
- 默认:
[\u4e00-\u9fa5\u0800-\u4e00a-zA-Z][\w\-\.]*
- 不符合规范的例子: 123=abc 1k=200 {“123”: “456”}等
设置覆盖模式,通过参数mode
-
支持的提取方式:REGEX、KV、CSV, Lookup, JSON
("msg",REGEX(r"(\w+):(\d+)",{r"k_\1": r"v_\2"}, mode="fill-auto")
- fill – 当原字段不存在或者值为空时
- add –当原字段不存在时设置
- overwrite – 总是设置
- fill/add/overwrite-auto – (当新值非空时才操作)
- 默认:fill-auto
4. 事件类操作函数详情
对事件进行直接操作的函数,
覆盖如下几类:
- 多字段KV提取
- 事件Meta操作:字段丢弃、重命名
- 事件输出:复制输出、输出后丢弃、多目标配置、重载元meta、附加更多TAG等
注意:事件类操作也支持与特定表达式函数互操作,如被表达式函数返回。
进一步详情,请参考用户手册。
进一步参考
欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持: