tencent cloud

日志服务

动态与公告
产品动态
公告
新手指引
产品简介
产品概述
产品优势
地域和访问域名
规格与限制
基本概念
购买指南
计费概述
产品定价
按量计费(后付费)
欠费说明
清理日志服务资源
成本优化
常见问题
快速入门
一分钟入门指南
入门指南
使用 Demo 日志快速体验 CLS
操作指南
资源管理
权限管理
日志采集
指标采集
日志存储
指标存储
检索分析(日志主题)
检索分析(指标主题)
仪表盘
数据处理
投递与消费
监控告警
云产品中心
DataSight 独立控制台
历史文档
实践教程
日志采集
检索分析
仪表盘
监控告警
投递和消费
成本优化
开发者指南
通过 iframe 内嵌 CLS(旧方案)
通过 Grafana 使用 CLS
API 文档
History
Introduction
API Category
Making API Requests
Topic Management APIs
Log Set Management APIs
Index APIs
Topic Partition APIs
Machine Group APIs
Collection Configuration APIs
Log APIs
Metric APIs
Alarm Policy APIs
Data Processing APIs
Kafka Protocol Consumption APIs
CKafka Shipping Task APIs
Kafka Data Subscription APIs
COS Shipping Task APIs
SCF Delivery Task APIs
Scheduled SQL Analysis APIs
COS Data Import Task APIs
Data Types
Error Codes
常见问题
健康监测问题解释
采集相关
检索分析相关
其他问题
服务等级协议
CLS 政策
隐私协议
数据处理和安全协议
联系我们
词汇表

键值提取函数

PDF
聚焦模式
字号
最后更新时间: 2024-01-20 17:59:06

简介

键值提取函数常见的使用场景如下图,处理为结构化数据之后,可以进一步用于 SQL 分析的场景。




ext_sep() 函数

函数定义

基于分隔符(单字符)提取字段值内容

语法描述

ext_sep("源字段名", "目标字段1,目标字段2,目标字段...", sep="分隔符", quote="不参与分割的部分"", restrict=False, mode="overwrite")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
field
待提取的字段名
string
-
用户日志中已存在的字段名
output
单个字段名或以英文半角逗号拼接的多个新字段名
string
-
-
sep
分隔符
string
,
任意单字符
quote
将值包括起来的字符
string
-
-
restrict
默认为 False。当提取的值个数与用户输入的目标字段数不一致时:
True:忽略,不进行任何提取处理
False:尽量匹配前几个字段
bool
False
-
mode
新字段的写入模式。默认强制覆盖
string
overwrite
-

示例

示例1:使用逗号作为分隔符,提取日志中的值。原始日志:
{"content": "hello Go,hello Java,hello python"}
加工规则:
//使用逗号作为分割符号,将content字段值分割为三段,分别对应f1,f2,f3三个字段。
ext_sep("content", "f1, f2, f3", sep=",", quote="", restrict=False, mode="overwrite")
//丢弃content字段
fields_drop("content")
加工结果:
{"f1":"hello Go","f2":"hello Java","f3":"hello python"}
示例2:使用 quote 将字符串整体处理。原始日志:
{"content": " Go,%hello ,Java%,python"}
加工规则:
ext_sep("content", "f1, f2", quote="%", restrict=False)
加工结果:
//%hello ,Java%虽然也有逗号,但它作为一个整体,就不参与分隔符提取。
{"content":" Go,%hello ,Java%,python","f1":" Go","f2":"hello ,Java"}
示例3:当 restrict=True, 表示当分割的值的个数和目标字段不同时,函数不执行。原始日志:
{"content": "1,2,3"}
加工规则:
ext_sep("content", "f1, f2", restrict=True)
加工结果:
{"content":"1,2,3"}

ext_sepstr() 函数

函数定义

基于指定的字符(多字符)提取字段值内容

语法描述

ext_sepstr("源字段名","目标字段1,目标字段2,目标字段...", sep="abc", restrict=False, mode="overwrite")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
field
待提取的字段名
string
-
用户日志中已存在的字段名
output
单个字段名或以英文半角逗号拼接的多个新字段名
string
-
-
sep
分隔字符(串)
string
,
-
restrict
默认为False。当提取的值个数与用户输入的目标字段数不一致时:
True:忽略,不进行任何提取处理。
False:尽量匹配前几个字段
bool
False
-
mode
新字段的写入模式。默认强制覆盖
string
overwrite
-

示例

原始日志:
{"message":"1##2##3"}
加工规则:
//使用“##”作为分割符,提取键值。
ext_sepstr("message", "f1,f2,f3,f4", sep="##")
加工结果:
//当目标字段的个数超出了分隔出的值,超出的字段返回"".
{"f1":"1","f2":"2","message":"1##2##3","f3":"3","f4":""}

ext_json() 函数

函数定义

从 JSON 中提取字段值

语法描述

ext_json("源字段名",prefix="",suffix="",format="full",exclude_node="不平铺的JSON节点")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
field
待提取的字段名
string
-
-
prefix
新字段前缀
string
-
-
suffix
新字段后缀
string
-
-
format
full:字段名格式为全路径(parent + sep + prefix + key + suffix)
simple:非全路径(prefix + key + suffix)
string
simple
-
sep
拼接符,用来拼接节点名使用
string
#
-
depth
最大展开层级深度,超过此层级的节点不再展开
number
100
1-500
expand_array
数组节点是否展开
bool
False
-
include_node
基于正则匹配节点名称的白名单
string
-
-
exclude_node
基于正则匹配节点名称的黑名单
string
-
-
include_path
基于正则匹配节点路径的白名单
string
-
-
exclude_path
基于正则匹配节点路径的黑名单
string
-
-
retain
保留某些特殊字符不做转义,例如:\\n、\\t
string
-
-
escape
是否需要对数据进行转义,默认值 True,有特殊字符时不能转义
bool
True
-

示例

示例1:提取全部节点的 KV 成为新字段,提取时不分层级,该例子是多层嵌套。原始日志:
{
"data": "{ \\"k1\\": 100, \\"k2\\": { \\"k3\\": 200, \\"k4\\": { \\"k5\\": 300}}}"
}
加工规则:
ext_json("data")
加工结果:
{"data":"{ \\"k1\\": 100, \\"k2\\": { \\"k3\\": 200, \\"k4\\": { \\"k5\\": 300}}}","k1":"100","k3":"200","k5":"300"}
示例2:sub_field1 不参与提取。 原始日志:
{"content": "{\\"sub_field1\\":1,\\"sub_field2\\":\\"2\\"}"}
加工规则:
//exclude_node=subfield1意思就是这个节点不提取
ext_json("content", format="full", exclude_node="sub_field1")
加工结果:
{"sub_field2":"2","content":"{\\"sub_field1\\":1,\\"sub_field2\\":\\"2\\"}"}
示例3:给子节点加上前缀 prefix。原始日志:
{"content": "{\\"sub_field1\\":{\\"sub_sub_field3\\":1},\\"sub_field2\\":\\"2\\"}"}
加工规则1:
//sub_field2被提取出来时,自动加上前缀udf\\_,成为udf\\_\\_sub\\_field2
ext_json("content", prefix="udf_", format="simple")
加工结果1:
{"content":"{\\"sub_field1\\":{\\"sub_sub_field3\\":1},\\"sub_field2\\":\\"2\\"}","udf_sub_field2":"2","udf_sub_sub_field3":"1"}
加工规则2:
//format=full表示提取的字段名自带层级关系,sub_field2被提取出来时,自动加上它的父节点名称,成为#content#__sub_field2
ext_json("content", prefix="__", format="full")
加工结果2:
{"#content#__sub_field2":"2","#content#sub_field1#__sub_sub_field3":"1","content":"{\\"sub_field1\\":{\\"sub_sub_field3\\":1},\\"sub_field2\\":\\"2\\"}"}
示例4:支持特殊字符。 原始日志1:
{"content": "{\\"sub_field1\\":1,\\"sub_field2\\":\\"\\\\n2\\"}"}
加工规则1:
ext_json("content",retain="\\n")
加工结果1:
{"sub_field2":"\\\\n2","content":"{\\"sub_field1\\":1,\\"sub_field2\\":\\"\\\\n2\\"}","sub_field1":"1"}
原始日志2:
{"content": "{\\"sub_field1\\":1,\\"sub_field2\\":\\"\\\\n2\\\\t\\"}"}
加工规则2:
ext_json("content",retain="\\n,\\t")
加工结果2:
{"sub_field2":"\\\\n2\\\\t","content":"{\\"sub_field1\\":1,\\"sub_field2\\":\\"\\\\n2\\\\t\\"}","sub_field1":"1"}
示例5:自定义是否进行转义。 原始日志:
{"message":"{\\"ip\\":\\"183.6.104.157\\",\\"params\\":\\"[{\\\\\\"tokenType\\\\\\":\\\\\\"RESERVED30\\\\\\",\\\\\\"otherTokenInfo\\\\\\":{\\\\\\"unionId\\\\\\":\\\\\\"123\\\\\\"},\\\\\\"unionId\\\\\\":\\\\\\"adv\\\\\\"}]\\"}"}
加工规则:
ext_json("message", escape=False)
fields_drop("message")
加工结果:
{"ip":"183.6.104.157", "params":"[{\\"tokenType\\":\\"RESERVED30\\",\\"otherTokenInfo\\":{\\"unionId\\":\\"123\\"},\\"unionId\\":\\"adv\\"}]"}

ext_json_jmes() 函数

函数定义

从 JSON 中提取字段值

语法描述

ext_json_jmes(“源字段名”, jmes= "提取JSON的公示", output="目标字段", ignore_null=True, mode="overwrite")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
field
待提取的字段名
string
-
-
jmes
jmes 表达式,请参考 JMESPath
string
-
-
output
输出字段名,仅支持单个字段
string
-
-
ignore_null
是否忽略节点值为 null 的节点,默认 True,忽略 null 字段值,否则当提取结果为 null 时,将输出空字符串
bool
True
-
mode
新字段的写入模式。默认强制覆盖
string
overwrite
-

示例

示例1:只提取多层 JSON 中的一个节点。 原始日志:
{"content": "{\\"a\\":{\\"b\\":{\\"c\\":{\\"d\\":\\"value\\"}}}}"}
加工规则:
//jmes="a.b.c.d"的意思是取a.b.c.d的值。
ext_json_jmes("content", jmes="a.b.c.d", output="target")
加工结果:
{"content":"{\\"a\\":{\\"b\\":{\\"c\\":{\\"d\\":\\"value\\"}}}}","target":"value"}
示例2:原始日志:
{"content": "{\\"a\\":{\\"b\\":{\\"c\\":{\\"d\\":\\"value\\"}}}}"}
加工规则:
//jmes="a.b.c.d"的意思是取a.b.c的值。
ext_json_jmes("content", jmes="a.b.c", output="target")
加工结果:
{"content":"{\\"a\\":{\\"b\\":{\\"c\\":{\\"d\\":\\"value\\"}}}}","target":"{\\"d\\":\\"value\\"}"}

ext_regex() 函数

函数定义

基于正则表达式提取字段值

语法描述

ext_regex(“源字段名”, regex="正则表达式", output=“目标字段1,目标字段2,目标字段......., mode="overwrite")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
field
待提取的字段名
string
-
-
regex
regex 表达式,如果包含了特殊字符,用户输入时需要进行转义,否则提示语法错误
string
-
-
output
单个字段名或以英文半角逗号拼接的多个新字段名
string
-
-
mode
新字段的写入模式。默认强制覆盖
string
overwrite
-

示例

示例1:匹配数字原始日志:
{"content": "1234abcd5678"}
加工规则:
ext_regex("content", regex="\\d+", output="target1,target2")
加工结果:
{"target2":"5678","content":"1234abcd5678","target1":"1234"}
示例2:有命名捕获,自动填充部分字段值。 原始日志:
{"content": "1234abcd"}
加工规则:
ext_regex("content", regex="(?<target1>\\d+)(.*)", output="target2")
加工结果:
{"target2":"abcd","content":"1234abcd","target1":"1234"}

ext_kv() 函数

函数定义

基于两级分割符提取字段值

语法描述

ext_kv("源字段名", pair_sep=r"\\s", kv_sep="=", prefix="", suffix="", mode="fill-auto")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
field
待提取的字段名
string
-
-
pair_sep
一级分隔符,分割多个键值对
string
-
-
kv_sep
二级分隔符,分割键和值
string
-
-
prefix
新字段前缀
string
-
-
suffix
新字段后缀
string
-
-
mode
新字段的写入模式。默认强制覆盖
string
-
-

示例

日志中有两级分割符“|”和“=”。
原始日志:
{"content": "a=1|b=2|c=3"}
加工规则:
ext_kv("content", pair_sep="|", kv_sep="=")
加工结果:
{"a":"1","b":"2","c":"3","content":"a=1|b=2|c=3"}

ext_first_notnull() 函数

函数定义

返回参数中第一个非 null 且非空字符的结果值

语法描述

ext_first_notnull(值1, 值2, ...)

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
可变参列表
参与计算的参数或表达式
string
-
-

示例

原始日志:
{"data1": null, "data2": "", "data3": "first not null"}
加工规则:
fields_set("result", ext_first_notnull(v("data1"), v("data2"), v("data3")))
加工结果:
{"result":"first not null","data3":"first not null","data2":"","data1":"null"}

ext_grok 函数

函数定义

基于 grok 语法提取匹配结果值

语法描述

ext_grok(字段值, grok="", extend="")

参数说明

参数名称
参数描述
参数类型
是否必须
参数默认值
参数取值范围
field
字段值
string
-
-
grok
表达式
string
-
-
extend
用户自定义的 GROK 表达式
string
-
-

示例

示例1 原始日志:
{"content":"2019 June 24 \\"I am iron man\\""}
加工规则:
ext_grok("content", grok="%{YEAR:year} %{MONTH:month} %{MONTHDAY:day} %{QUOTEDSTRING:motto}")
fields_drop("content")
加工结果:
{"day":"24", "month":"June", "motto":"I am iron man", "year":"2019"}
示例2 原始日志:
{"content":"Beijing-1104,Beijing-Beijing"}
加工规则:
ext_grok("content", grok="%{ID1:user_id1},%{ID2:user_id2}",extend="ID1=%{WORD}-%{INT},ID2=%{WORD}-%{WORD}")
fields_drop("content")
加工结果:
{"user_id1":"Beijing-1104", "user_id2":"Beijing-Beijing"}


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈