日志服务 行处理函数

这篇说说腾讯云CLS数据加工中日志处理函数,包括输出(log_output、log_auto_output)、分裂(log_split、log_split_jsonarray_jmes)及过滤(log_drop、log_keep)功能,支持按条件分发日志至不同主题、动态创建主题并管理资源。 log_auto_output:按字段值动态创建日志主题,支持索引、存储周期等配置,通过自定义ID绑定管理资源。 log_spl。

相关产品
日志服务 产品页,含版本规格、价格与购买入口。

对一行日志进行处理,包括过滤、分发、分裂等函数。

二、函数定义

输出到指定的目标主题。可以配合分支条件使用,也可以单独使用。

三、语法描述

log_output(别名 Alias)

别名在配置加工任务时定义:

四、参数说明

参数名称 参数描述 参数类型 是否必须 参数默认值 参数取值范围
alias 目标主题的别名。 string 是 – –

五、示例

按照 loglevel 字段值为 warning/info/error 的情况,分发到三个不同的日志主题中。

原始日志:

[ { "loglevel": "warning" }, { "loglevel": "info" }, { "loglevel": "error" }]

加工规则:

//按照 loglevel 字段值为 warning/info/error 的情况,分发到三个不同的日志主题中。t_switch(regex_match(v("loglevel"),regex="info"),log_output("info_log"),regex_match(v("loglevel"),regex="warning"),log_output("warning_log"),regex_match(v("loglevel"),regex="error"),log_output("error_log"))

加工结果如下:

七、函数定义

将日志输出到动态的目标主题。例如你需要根据日志字段"pd"的值,动态创建多个目标日志主题,并将对应的日志分发至目标日志主题。假设 pd 的值为"CLB "、"Ckafka"、"COS"、"CDN",使用该函数,将会动态创建出名为"CLB "、"Ckafka"、"COS"、"CDN"的目标日志主题,并将相关的日志写入对应的主题,同时,你可对这些新建主题的索引类型、存储周期进行配置。

八、语法描述

log_auto_output(topic_name="", logset_name="", index_options="", period=3,storage_type=" ",hot_period=0)

九、参数说明

参数名称 参数描述 参数类型 是否必须 参数默认值 参数说明
topic_name 动态生成的日志主题名称。假设 pd 的值为"CLB"、"Ckafka"、"COS"、"CDN",使用该函数,将会动态创建出名为"CLB"、"Ckafka"、"COS"、"CDN"的目标日志主题。 string y – 参数 topic_name 中包含"|","|"将在生成的主题名称中被去除。参数 topic_name 长度超出250字符,生成的日志主题名称仅有前250个字符,超出的会被截断。
logset_name 动态生成的日志主题名称。例如"my_logSet",任务将为你生成名字为"my_logSet" 的日志集 例如 v("namespace"),任务将为你生成名字为"dev"、"test"2个日志集。(假定你的日志中,namespace 字段是以上2个值。) string y – –
index_options all_index:开启键值、全文索引。no_index:不开启索引。content_index:开启全文。key_index:开启键值索引。 string n all_index 如果 storage_type=cold,即低频存储,则 all_index 和 key_index 不会生效,即低频存储不支持键值索引。
period 存储周期,一般取值范围是1 – 3600天,3640 代表永久存储。 number n 3 1 – 3600天。
storage_type 日志主题的存储类型,可选值:hot:标准存储cold:低频存储 string n hot 当为 cold 时,period 最小为7天。
hot_period 0:关闭日志沉降非0:开启日志沉降后标准存储的天数HotPeriod 需要大于等于7,且小于 Period,仅在 StorageType 为 hot 时生效。 number n 0 –
tag_dynamic 为日志主题添加动态标签,和 extract_tag() 函数配合使用,用于从日志字段中提取标签的 KV,例如:tag_dynamic=extract_tag(v("pd"),v("env"),v("team"), v("person"))。 string n – 和 tag_static 一起不超过10对标签。
tag_static 为日志主题添加静态标签,例如:tag_static="Ckafka:test_env,developer_team:MikeWang"。 string n – 和 tag_dynamic 一起不超过10对标签示例。

十、示例

原始日志:

[ { "pd": "CLB", "dateTime": "2023-05-25T00:00:26.579" }, { "pd": "Ckafka", "time": "2023-05-25T18:00:55.350+08:00" }, { "pd": "COS", "time": "2023-05-25T00:06:20.314+08:00" }, { "pd": "CDN", "time": "2023-05-25T00:03:52.051+08:00" }]

加工规则:

log_auto_output(v("pd"),"我的日志集",index_options="content_index", period=3)

加工结果:自动生成了四个日志主题,分别是"CLB "、"Ckafka"、"COS"和"CDN",日志集名称为"我的日志集":

十一、管理机制说明

数据加工任务针对动态生成的日志集、日志主题的管理机制:自定义 ID 绑定。

数据加工任务(如执行 log_auto_output 函数)运行时,会根据你填写的日志集/日志主题名称、地域和 AppID,通过 MD5 算法,为动态生成的日志集/日志主题生成一个自定义 ID。任务管理日志集/日志主题,向日志主题里写入数据时,只认这个自定义 ID,而不认控制台显示的日志集/日志主题名称。

十二、典型场景与示例说明

场景一:在控制台手动改名(数据写入不受影响)

由于任务是通过自定义 ID 管理资源的,因此你在控制台修改已生成的日志集或主题名称,不会影响数据的后续写入。

·示例:任务动态创建了一个日志主题叫 Nginx,你在控制台将其改名为 Nginx001。

·结果:数据加工任务不会重新创建一个叫 Nginx 的新日志主题,而是顺着底层 ID 准确无误地继续写入改名后的 Nginx001。

场景二:修改代码参数并重启(只对新资源生效)

如果你直接修改了加工脚本(代码)中的名称参数,相当于改变了自定义 ID 的计算因子,底层会将其视为一个全新的任务。

·示例:

1. 初始代码:log_auto_output("mytopic", "mylogset")–>任务生成了"mylogset"日志集。

2. 你在控制台手动将它改名为"myLogSet-1"。

3. 随后你修改代码并重启任务:log_auto_output("mytopic", "myLogSet-1")。

·结果:任务无法感知你在控制台的改名操作。由于代码参数变了,它会计算出一个新的 ID,并直接创建一个名为 "myLogSet-1-CreateByCLSETL" 的新日志集,而不会写入你改名后的"myLogSet-1"。

场景三:重名处理

当动态创建的名称与现有日志主题/日志集合重名时,系统处理逻辑如下:

重名的场景 处理规则 实际结果示例
手动建了日志集/日志主题 test,任务也要建 test。 自动追加 -CreateByCLSETL 后缀以作隔离。 任务实际创建出名称为 test-CreateByCLSETL 的日志集/日志主题。
加工任务1和任务2都定义了日志集为 myLogSet。 只要计算出的自定义 ID 相同,后来的任务会复用已有资源,不再加后缀。 任务2直接共用该日志集,不会重复创建。

十三、日志主题添加标签

特殊场景 处理逻辑
动态标签的 KV 值获取失败 例如指定 A 字段的值为标签的 Key,B 字段的值为标签的 Value,但某行日志没有 A 字段或者 B 字段,或者 A 字段 B 字段的值为空,标签添加失败。
标签的 KV 值前后有空格 标签添加失败。
动态标签和静态标签的总数超过10对 动态标签优先级较高,如添加完动态标签后,还不足10对,补充静态标签,但总个数不超过10对。
标签 KV 的长度超出限制 标签的 key 长度大于127,value 的长度大于255,标签添加失败。

注意:说明:

注意:如果你在 POC 时需要反复重建同名加工任务,其流程如下:

注意:1. 先删除老的数据加工任务,否则还会持续生成日志主题。

注意:2. 删除兜底主题 auto_undertake_topic_${etl-task-name} ,如果连续3次创建同名任务,超限兜底主题会创建失败,进而阻塞任务正常启动。

注意:如果 POC 的数据是同一套,不是实时数据,建议删除老任务已经生成的日志集和日志主题。

十五、函数定义

使用分隔符结合 jmes 表达式,对特定字段进行拆分,拆分结果分裂为多行日志。

十六、语法描述

log_split(field, sep=",", quote="\\", jmes="", output="")

十七、参数说明

参数名称 参数描述 参数类型 是否必须 参数默认值 参数取值范围
field 待提取的字段名。 string 是 – –
sep 分隔符。 string 否 , 任意单字符
quote 将值包括起来的字符。 string 否 – –
jmes Jmes 表达式,详情请参见 JMESPath。说明:如果 jmes 中包含了特殊字符,例如 . \\ * + ? ^ $ | () [] {} – /时,需要加上转义符。 string 否 – –
output 单个字段名。 string 是 – –

十八、示例

·示例1:字段中有多个值的日志分裂

{"field": "hello Go,hello Java,hello python","status":"500"}

加工规则:

//使用分隔符“,”,将日志分隔成三条。log_split("field", sep=",", output="new_field")

加工结果:

{"new_field":"hello Go","status":"500"}{"new_field":"hello Java","status":"500"}{"new_field":"hello python","status":"500"}

·示例2:利用 JMES 对日志进行分裂。

{"field": "{\\"a\\":{\\"b\\":{\\"c\\":{\\"d\\":\\"a,b,c\\"}}}}", "status": "500"}

加工规则:

//a.b.c.d节点的值为“a,b,c”log_split("field", jmes="a.b.c.d", output="new_field")

加工结果:

{"new_field":"a","status":"500"}{"new_field":"b","status":"500"}{"new_field":"c","status":"500"}

·示例3:包含有 JSON 数组的日志分裂。

{"field": "{\\"a\\":{\\"b\\":{\\"c\\":{\\"d\\":[\\"a\\",\\"b\\",\\"c\\"]}}}}", "status": "500"}

加工规则:

log_split("field", jmes="a.b.c.d", output="new_field")

加工结果:

{"new_field":"a","status":"500"}{"new_field":"b","status":"500"}{"new_field":"c","status":"500"}

20、函数定义

丢弃符合条件的日志。

21、语法描述

log_drop(条件1)

22、参数说明

参数名称 参数描述 参数类型 是否必须 参数默认值 参数取值范围
condition 值为 bool 类型的函数表达式。 bool 是 – –

23、示例

丢弃 status=200的日志,其余保留。

原始日志:

[ { "field": "a,b,c", "status": "500" }, { "field": "a,b,c", "status": "200" }]

加工规则:

log_drop(op_eq(v("status"), 200))

加工结果:

{"field":"a,b,c","status":"500"}

25、函数定义

保留符合条件的日志。

26、语法描述

log_keep(条件1)

27、参数说明

参数名称 参数描述 参数类型 是否必须 参数默认值 参数取值范围
condition 值为 bool 类型的函数表达式。 bool 是 – –

28、示例

保留 status=500的日志,其余丢弃。

原始日志:

[ { "field": "a,b,c", "status": "500" }, { "field": "a,b,c", "status": "200" }]

加工规则:

log_keep(op_eq(v("status"), 500))

加工结果:

{"field":"a,b,c","status":"500"}

30、函数定义

将日志根据 Jmes 语法将 JSON 数组拆分和展开。

31、语法描述

log_split_jsonarray_jmes("field", jmes="items", prefix="")

32、参数说明

参数名称 参数描述 参数类型 是否必须 参数默认值 参数取值范围
field 待提取的字段名。 string 是 – –
jmes 待处理的 json array 的名称。 string 否 – –
prefix 为数组中的元素加上前缀。 string 否 – –

33、示例

·示例1

原始日志:

{"common":"common","result":"{\\"target\\":[{\\"a\\":\\"a\\"},{\\"b\\":\\"b\\"}]}"}

加工规则:

log_split_jsonarray_jmes("result",jmes="target")fields_drop("result")

加工结果:

{"common":"common", "a":"a"}{"common":"common", "b":"b"}

·示例2

原始日志:

{"common":"common","target":"[{\\"a\\":\\"a\\"},{\\"b\\":\\"b\\"}]"}

加工规则:

log_split_jsonarray_jmes("target",prefix="prefix_")fields_drop("target")

加工结果:

{"prefix_a":"a", "common":"common"}{"prefix_b":"b", "common":"common"}

赞 (0)
上一篇 4天前
下一篇 4天前