日志服务数据加工:语法框架与样例

本文涉及的产品
对象存储 OSS,OSS 加速器 50 GB 1个月
简介: 日志服务数据加工上线,本文概述其语法框架与样例,覆盖事件操作宏、事件类操作函数、字段类操作函数、表达式函数等

概述

目前数据加工全面支持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:动态设置值
这里组合调用表达式函数,从字段retreturn中首先存在的字段的值,返回其小写赋值给字段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_bodyresponse_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:一般操作
丢弃事件字段field1field2

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)

注意:其中KEEPDROP是保留和丢弃事件类操作的标示。

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, ....]构成的列表。每次检查每个条件操作的条件,满足即执行器操作,否则无操作。之后继续检查下一条条件操作,除非某一步丢弃了事件。
注意:整个列表必须用[]括起来,其中每个条件操作都需要用()括起来。

条件语法说明

  • 固定条件标识:是使用某些预定义的标识,例如ANYALL等都标识所有,也就是任意事件均会匹配并执行后续操作。
  • 键值对:{ key : value } 是对字段值用正则完全匹配,注意,其中的字段的值必须与正则表达式是完全匹配(从头到尾匹配)才能算满足条件。

    • 例如:字段user的值为"i love python", 那么正则表达式"i love"或者"python"均无法匹配。
    • 多个键值队的关系是AND关系,必须全满足才能执行配对的操作(列表)。
    • 对正则用NOT调动后,逻辑关系变成了not
  • 可以通过表达式函数来以返回的值作为判断条件(默认空字符串、None、布尔值False、数字0、空列表等表示不满足,其他情况表示都表示满足。
  • 通过对多个逻辑用列表组合,表达了OR的意义,也就是只需要有一个满足,即执行配对的操作(列表)

    • 注意OR、AND、NOT等等逻辑目前版本不能任意嵌套。
    • 有复杂逻辑判断的,可以使用表达式函数
  • 表达式函数参考表达式函数

1.4.2. 样例

例子1:值匹配后操作
字段resultfailedfailure时,设置事件主题为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将满足条件的事件输出后,事件会继续后续处理,(可以理解为复制一份输出了)。
  • 事件类操作函数`OUTPUTCOUTPUT`支持更多的行为定制。参考事件类操作函数

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等

注意:事件类操作也支持与特定表达式函数互操作,如被表达式函数返回。

进一步详情,请参考用户手册。

进一步参考

欢迎扫码加入官方钉钉群获得实时更新与阿里云工程师的及时直接的支持:
image

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
7月前
|
SQL 人工智能 监控
SLS Copilot 实践:基于 SLS 灵活构建 LLM 应用的数据基础设施
本文将分享我们在构建 SLS SQL Copilot 过程中的工程实践,展示如何基于阿里云 SLS 打造一套完整的 LLM 应用数据基础设施。
1954 101
|
7月前
|
数据采集 运维 监控
不重启、不重写、不停机:SLS 软删除如何实现真正的“无感数据急救”?
SLS 全新推出的「软删除」功能,以接近索引查询的性能,解决了数据应急删除与脏数据治理的痛点。2 分钟掌握这一数据管理神器。
756 48
|
11月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
本文介绍了阿里集团A+流量分析平台的日志查询优化方案,针对万亿级日志数据的写入与查询挑战,提出基于Flink、Paimon和StarRocks的技术架构。通过Paimon存储日志数据,结合StarRocks高效计算能力,实现秒级查询性能。具体包括分桶表设计、数据缓存优化及文件大小控制等措施,解决高并发、大数据量下的查询效率问题。最终,日志查询耗时从分钟级降至秒级,显著提升业务响应速度,并为未来更低存储成本、更高性能及更多业务场景覆盖奠定基础。
|
8月前
|
存储 缓存 Apache
StarRocks+Paimon 落地阿里日志采集:万亿级实时数据秒级查询
A+流量分析平台是阿里集团统一的全域流量数据分析平台,致力于通过埋点、采集、计算构建流量数据闭环,助力业务提升流量转化。面对万亿级日志数据带来的写入与查询挑战,平台采用Flink+Paimon+StarRocks技术方案,实现高吞吐写入与秒级查询,优化存储成本与扩展性,提升日志分析效率。
1047 1
|
SQL 监控 数据挖掘
SLS 重磅升级:超大规模数据实现完全精确分析
SLS 全新推出的「SQL 完全精确」模式,通过“限”与“换”的策略切换,在快速分析与精确计算之间实现平衡,满足用户对于超大数据规模分析结果精确的刚性需求。标志着其在超大规模日志数据分析领域再次迈出了重要的一步。
800 118
|
8月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL数据库的WAL日志与数据写入的过程
PostgreSQL中的WAL(预写日志)是保证数据完整性的关键技术。在数据修改前,系统会先将日志写入WAL,确保宕机时可通过日志恢复数据。它减少了磁盘I/O,提升了性能,并支持手动切换日志文件。WAL文件默认存储在pg_wal目录下,采用16进制命名规则。此外,PostgreSQL提供pg_waldump工具解析日志内容。
743 0
|
8月前
|
数据采集 运维 监控
|
10月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
1108 4
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
432 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件

相关产品

  • 日志服务