帮你快速理解、总结文档立即下载

行处理函数

最近更新时间:2026-09-09 14:10:03
我的收藏
对一行日志进行处理,包括过滤、分发、分裂等函数。


log_output 函数

函数定义

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

语法描述

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"))
加工结果如下图所示:




log_auto_output 函数

函数定义

将日志输出到动态的目标主题。例如您需要根据日志字段"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
动态生成的日志主题名称。
例如 v("loglevel"),任务将为您生成名字为 "Error"、"Info"、"Warning"三个日志主题。
(假定您的日志中,loglevel 字段是以上3个值)
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对标签示例。
注意:
修改 log_auto_output() 函数中的参数,并重启任务之后,仅对新生成的主题生效,已生成的主题不受影响。如果您需要调整已经生成的日志集或主题的属性,请前往 日志主题列表 或调用 API 进行修改。
删除数据加工任务(动态创建主题),不会删除已创建的日志集和日志主题。
参数 topic_name 获取失败或者为""(空字符串),该行日志将进入名称为"null"的日志主题,如果您不想使用"null"这个主题名称,您可参考语句 log_auto_output( str_join("-", "myPrefix", v("app")), "myLogSet"),那么当 app 不存在或者值为" "时,日志将写入名称为“myprefix”的日志主题。
日志集和日志主题名称,不区分英文大小写,abc 和 Abc 在 CLS 侧代表同一个资源。

示例

原始日志:
[
{
"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 的数据是同一套,不是实时数据,建议删除老任务已经生成的日志集和日志主题。

log_split 函数

函数定义

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

语法描述

log_split(filed, 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"}

log_drop 函数

函数定义

丢弃符合条件的日志。

语法描述

log_drop(条件1)

参数说明

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

示例

丢弃 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"}

log_keep 函数

函数定义

保留符合条件的日志。

语法描述

log_keep(条件1)

参数说明

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

示例

保留 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"}

log_split_jsonarray_jmes 函数

函数定义

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

语法描述

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

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
field
待提取的字段名
string
-
-

示例

示例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"}