本文档介绍键值提取函数的语法与格式、相关的场景示例。
基于单个字符的分隔符提取字段值内容。
ext_sep(field, output="目标字段名1,目标字段名2,目标字段名...", sep=",", quote="\"", restrict=False, mode="overwrite")
参数说明如下:
参数 | 参数类型 | 是否必选 | 默认值 | 取值范围 | 说明 |
---|---|---|---|---|---|
field | String | 是 | / | / | 待分隔的日志字段名。 |
output | String | 是 | / | / | 提取后输出的字段名,多个字段以英文半角逗号(,)分隔。 |
sep | String | 否 | , | 单个字符 | 分隔符。 |
quote | String | 否 | " | 单个字符 | 在该字符对内的 String 不参与分割。 |
restrict | Boolean | 否 | False | / | 当提取的值个数与用户输入的目标字段数不一致时:
|
mode | String | 否 | overwrite | overwrite,fill | 当指定字段不存在时的处理逻辑。
|
场景:根据逗号(,)将日志中 content
字段的值提取为多个字段。
加工规则:
ext_sep("content", "city-1,city-2,city-3")
日志样例:
{ "content":"shanghai,hangzhou,chengdu" }
加工结果 :
{ "content":"shanghai,hangzhou,chengdu", "city-1":"shanghai", "city-2":"hangzhou", "city-3":"chengdu" }
基于指定的字符串提取字段值内容。
ext_sepstr(field, output="目标字段名1,目标字段名2,目标字段名...", sep="||", restrict=False, mode="overwrite")
参数说明如下:
参数 | 参数类型 | 是否必选 | 默认值 | 取值范围 | 说明 |
---|---|---|---|---|---|
field | String | 是 | / | / | 待分隔的日志字段名。 |
output | String | 是 | / | / | 提取后输出的字段名,多个字段以英文半角逗号(,)分隔。 |
sep | String | 否 | , | / | 分隔字符串。 |
restrict | Boolean | 否 | False | / | 当提取的值个数与用户输入的目标字段数不一致时:
|
mode | String | 否 | overwrite | overwrite,fill | 当指定字段不存在时的处理逻辑。
|
场景:根据字符串 ||
将日志中 content
字段的值提取为多个字段。
加工规则:
ext_sepstr("content", "city-1,city-2,city-3")
日志样例:
{ "content":"shanghai||hangzhou||chengdu" }
加工结果:
{ "content":"shanghai||hangzhou||chengdu" "city-1":"shanghai", "city-2":"hangzhou", "city-3":"chengdu" }
对指定字段中的 JSON 字符串进行展开操作。
说明
如果 JSON 字段不同层次中存在重复的 Key,建议使用 include_node 等筛选列表参数,或指定格式化方式为全路径(fmt=full)避免该 Key 的值被覆盖。例如 JSON 字符串为 { "time": "2023”, "info": { "time": "10:45" } }
,展开后 time
字段可能为 2023
或 10:45
,如果需要指定 time
固定为 info
中的 time
字段,可以将 ext_json 函数指定为 ext_json("data",include_path="data.info.time")
或者 ext_json("data",fmt="full")
。
ext_json(field, depth=2, prefix="pre_",suffix="_",fmt="simple",sep=".",expand_array=True)
参数说明如下:
参数 | 参数类型 | 是否必选 | 默认值 | 取值范围 | 说明 |
---|---|---|---|---|---|
field | String | 是 | / | / | 待展开的原始字段名。 |
depth | Number | 否 | 100 | 1~500 | 展开的 JSON 层次。 |
prefix | String | 否 | 不添加前缀 | / | 被展开 JSON 字符串中,最深层节点的前缀。 |
suffix | String | 否 | 不添加后缀 | / | 被展开 JSON 字符串中,最深层节点的后缀。 |
fmt | String | 否 | simple |
| 格式化方式。支持配置为:
|
sep | String | 否 | . | / | 父子节点格式化时的分隔符。仅当参数 fmt 取值为 full 时可以设置。 |
expand_array | Boolean | 否 | True |
| 是否展开数组。
|
include_node | String | 否 | 不做处理 | / | 筛选和过滤时允许的节点名称,通过正则表达式匹配。默认只有中文、数字、字母和 |
exclude_node | String | 否 | 不做处理 | / | 筛选和过滤时需要排除的节点,通过正则表达式匹配。 |
include_path | String | 否 | 不做处理 | / | 筛选和过滤时包含的节点路径,通过正则表达式匹配。 |
exclude_path | String | 否 | 不做处理 | / | 筛选和过滤时需要排除的节点路径,通过正则表达式匹配。 |
函数示例 1:
场景:从日志 content
字段中展开 JSON 数据,前缀为 pre_
,后缀为 suf_
,fmt 格式默认为 simple。
加工规则:
ext_json("content",prefix="pre_",suffix="suf_")
日志样例:
{ "content":"{\"k1\": \"v1\",\"k2\": {\"k3\": \"v3\"}}" }
加工结果:
{ "content":"{\"k1\": \"v1\",\"k2\": {\"k3\": \"v3\"}}", "pre_k1suf_":"v1", "pre_k3suf_":"v3" }
函数示例 2:
场景:从日志 content
字段中展开 JSON 数据,fmt 格式为 full 全路径,depth 深度为 1。
加工规则:
ext_json("content",depth=1,fmt="full")
日志样例:
{ "content":"{\"k1\": \"v1\",\"k2\": {\"k3\": \"v3\"}}" }
加工结果:
{ "content":"{\"k1\": \"v1\",\"k2\": {\"k3\": \"v3\"}}", "content.k1":"v1", "content.k2":"{\"k3\": \"v3\"}}" }
函数示例 3:
场景:从日志 content
字段中展开 JSON 数据,只保留 k1 节点数据。
加工规则:
ext_json("content",include_node="k1")
日志样例:
{ "content":"{\"k1\": \"v1\",\"k2\": {\"k3\": \"v3\"}}" }
加工结果:
{ "content":"{\"k1\": \"v1\",\"k2\": {\"k3\": \"v3\"}}", "k1":"v1" }
使用 jmes 表达式从 json 中提取字段值。
ext_json_jmes(field, jmes="提取JSON的jmes path", output="目标字段", ignore_null=True, mode="overwrite")
参数说明如下:
参数 | 参数类型 | 是否必选 | 默认值 | 取值范围 | 说明 |
---|---|---|---|---|---|
field | String | 是 | / | / | 待提取的原始字段名。 |
jmes | String | 是 | / | / | jmes 表达式。 |
output | String | 是 | / | / | 提取后输出的字段名。 |
ignore_null | Boolean | 否 | True | / | 是否忽略节点值为 null 的节点:
|
mode | String | 否 | overwrite | overwrite,fill | 当指定字段不存在时的处理逻辑。
|
场景:从日志 content
字段中按照“k3.k4” jmes 路径提取字段值输出到字段 k3-k4
中。
加工规则:
ext_json_jmes("content", jmes="k3.k4", output="k3-k4")
日志样例:
{ "content":"{\"k1\": 123, \"k2\": \"456\", \"k3\": {\"k4\": -34.5, \"k5\": true}}" }
加工结果:
{ "content":"{\"k1\": 123, \"k2\": \"456\", \"k3\": {\"k4\": \"-34.5\", \"k5\": True}}", "k3-k4":"-34.5" }
基于两级分割符提取字段的值。
ext_kv(field, pair_sep="\s", kv_sep="=", prefix="", suffix="", mode="overwrite")
参数说明如下:
参数 | 参数类型 | 是否必选 | 默认值 | 取值范围 | 说明 |
---|---|---|---|---|---|
field | String | 是 | / | / | 源字段名。 |
pair_sep | String | 否 | \s (空格) | / | 一级分隔符,分割多个键值对。 |
kv_sep | String | 否 | = | / | 二级分隔符,分割键和值。 |
prefix | String | 否 | / | / | 新字段前缀。 |
suffix | String | 否 | / | / | 新字段后缀。 |
mode | String | 否 | fill | overwrite,fill | 当指定字段不存在时的处理逻辑。
|
场景:提取日志中的 content
字段的值后,根据符号(&)将值分为键值对,再根据符号(=)将键值对分隔为键和值。
加工规则:
ext_kv("content", pair_sep="&", kv_sep="=")
日志样例:
{ "content":"f1=a&f2=b&f3=c" }
加工结果:
{ "content":"f1=a&f2=b&f3=c", "f1":"a", "f2":"b", "f3":"c" }
根据指定的正则表达式提取指定字段的值,并赋值给其他字段。
ext_regex(field,regex="regex",output=输出字段,mode="overwrite")
参数说明如下:
参数 | 参数类型 | 是否必选 | 默认值 | 取值范围 | 说明 |
---|---|---|---|---|---|
field | String | 是 | / | / | 待提取值的字段名称。如果指定的字段不存在,则不进行任何操作。 |
regex | String | 是 | / | / | 用于提取字段的正则表达式。符合正则表达式规则的字段值将被提取。 |
output | String | 否 | / | / | 匹配后输出字段。如果指定的字段不存在,则不进行任何操作。如果指定多个字段,则需要用英文逗号分隔。 |
mode | String | 否 | fill |
| 指定值对输出字段的覆盖模式。
|
函数示例 1:
场景:提取日志字段 call_record
通话记录中的呼叫者。
加工规则:
ext_regex("call_record","\d{11}","caller")
日志样例:
{ "call_record": "caller:13800000000 called:13800000001" }
加工结果:
{ "call_record": "caller:13800000000 called:13800000001", "caller": "13800000000" }
函数示例 2:
场景:提取日志字段 call_record
通话记录中的呼叫者和被叫者。
加工规则:
ext_regex("call_record","\d{11}","caller,called")
日志样例:
{ "call_record": "caller:13800000000 called:13800000001" }
加工结果:
{ "call_record": "caller:13800000000 called:13800000001", "caller": "13800000000", "called": "13800000001" }
函数示例 3:
场景:提取日志字段 call_record
通话记录中的呼叫者,并覆盖 origin_caller
字段。
加工规则:
ext_regex("call_record","\d{11}","origin_caller","overwrite")
日志样例:
{ "call_record": "caller:13800000000 called:13800000001", "origin_caller": "13800000002" }
加工结果:
{ "call_record": "caller:13800000000 called:13800000001", "origin_caller": "13800000000" }
GROK 函数根据正则表达式提取特定的值,GROK表达式把常见的正则表达式定义好,比如IP地址、文件路径,直接使用即可。常见的 GROK 表达式请参考官方文档。
ext_grok(field,通用 GROK 表达式,extend=自定义 GROK 表达式)
参数说明如下:
参数 | 参数类型 | 是否必选 | 说明 |
---|---|---|---|
field | String | 是 | 待提取字段名。 |
grok | String | 是 | GROK 表达式。 |
extend | Dict | 否 | 自定义 GROK 表达式,其中 key 和 value 必须是字符串格式。 |
函数示例 1:
场景:计算日志字段 content
中的年月日和引用字符串。
加工规则:
ext_grok("content","%{YEAR:year} %{MONTH:month} %{MONTHDAY:day} %{QUOTEDSTRING:motto}")
日志样例:
{ "content":"2023 August 7 \"It is sunny day\"" }
加工结果:
{ "content":"2023 August 7 "It is sunny day"", "year": "2023", "month": "August", "day": "7", "motto": "\"It is sunny day\"" }
函数示例 2:
场景:根据自定义的 GROK 表达式,提取日志中的 ID。
加工规则:
ext_grok("content", "%{ID1:user_id1},%{ID2:user_id2}",extend=dict_make("ID1","%{WORD}-%{INT}","ID2","%{WORD}-%{WORD}"))
日志样例:
{ "content": "Chengdu-1023,Chongqing-Chongqing" }
加工结果:
{ "content": "Chengdu-1023,Chongqing-Chongqing", "user_id1": "Chengdu-1023", "user_id2": "Chongqing-Chongqing" }