You need to enable JavaScript to run this app.
导航

键值提取函数

最近更新时间2023.11.13 16:31:35

首次发布时间2023.02.16 18:06:17

本文档介绍键值提取函数的语法与格式、相关的场景示例。

ext_sep 函数

基于单个字符的分隔符提取字段值内容。

函数语法/格式

ext_sep(field, output="目标字段名1,目标字段名2,目标字段名...", sep=",", quote="\"", restrict=False, mode="overwrite")

参数说明如下:

参数

参数类型

是否必选

默认值

取值范围

说明

field

String

/

/

待分隔的日志字段名。

output

String

/

/

提取后输出的字段名,多个字段以英文半角逗号(,)分隔。

sep

String

,

单个字符

分隔符。

quote

String

"

单个字符

在该字符对内的 String 不参与分割。

restrict

Boolean

False

/

当提取的值个数与用户输入的目标字段数不一致时:

  • True:忽略,不进行任何提取处理。
  • False:尽量匹配前几个字段。

mode

String

overwrite

overwrite,fill

当指定字段不存在时的处理逻辑。

  • 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 函数

基于指定的字符串提取字段值内容。

函数语法/格式

ext_sepstr(field, output="目标字段名1,目标字段名2,目标字段名...", sep="||", restrict=False, mode="overwrite")

参数说明如下:

参数

参数类型

是否必选

默认值

取值范围

说明

field

String

/

/

待分隔的日志字段名。

output

String

/

/

提取后输出的字段名,多个字段以英文半角逗号(,)分隔。

sep

String

,

/

分隔字符串。

restrict

Boolean

False

/

当提取的值个数与用户输入的目标字段数不一致时:

  • True:忽略,不进行任何提取处理。
  • False:尽量匹配前几个字段。

mode

String

overwrite

overwrite,fill

当指定字段不存在时的处理逻辑。

  • 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"
    }
    

ext_json 函数

对指定字段中的 JSON 字符串进行展开操作。

说明

如果 JSON 字段不同层次中存在重复的 Key,建议使用 include_node 等筛选列表参数,或指定格式化方式为全路径(fmt=full)避免该 Key 的值被覆盖。例如 JSON 字符串为 { "time": "2023”, "info": { "time": "10:45" } },展开后 time 字段可能为 202310: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 字符串中,最深层节点的前缀。
仅最深层 JSON 层次才会添加前缀。

suffix

String

不添加后缀

/

被展开 JSON 字符串中,最深层节点的后缀。
仅最深层 JSON 层次才会添加后缀。

fmt

String

simple

  • full
  • simple

格式化方式。支持配置为:

  • full:字段名为父节点与当前节点合并后的全路径,格式为 {parent}{sep}{prefix}{key}{suffix}。其中分隔符为 sep 参数指定的字符,默认为英文句号(.)。 例如,data 字段中提取 json 的 key,字段名为data.key
  • simple:字段名为节点名称。格式为 {prefix}{key}{suffix}

sep

String

.

/

父子节点格式化时的分隔符。仅当参数 fmt 取值为 full 时可以设置。

expand_array

Boolean

True

  • True
  • False

是否展开数组。

  • True:展开,把数组内元素展开作为 key。
  • False:不展开,把数组作为整体作为 value。

include_node

String

不做处理

/

筛选和过滤时允许的节点名称,通过正则表达式匹配。默认只有中文、数字、字母和_.-的节点才会被自动展开。
设置节点允许列表之后,仅包含在列表中的才会出现在结果中。例如 ext_json("json_data_filed", ...., include_node="k\d+")

exclude_node

String

不做处理

/

筛选和过滤时需要排除的节点,通过正则表达式匹配。
设置节点排除列表之后,列表以外的内容都会被排除在外。例如 ext_json("json_data_filed", ...., exclude_node="k\d+")

include_path

String

不做处理

/

筛选和过滤时包含的节点路径,通过正则表达式匹配。
include_pathexclue_path 的正则式从路径开头开始匹配,匹配路径以英文句号(.)分隔。例如 ext_json("json_data_filed", ...., include_path="content.k\d+")

exclude_path

String

不做处理

/

筛选和过滤时需要排除的节点路径,通过正则表达式匹配。
include_pathexclue_path 的正则式从路径开头开始匹配,匹配路径以英文句号(.)分隔。例如 ext_json("json_data_filed", ...., exclude_path="content.k\d+")

函数示例

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

ext_json_jmes 函数

使用 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 的节点:

  • True: 忽略 null 字段值。
  • False: 当提取结果为 null 时,将输出空字符串。

mode

String

overwrite

overwrite,fill

当指定字段不存在时的处理逻辑。

  • 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 函数

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

函数语法/格式

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

当指定字段不存在时的处理逻辑。

  • 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 函数

根据指定的正则表达式提取指定字段的值,并赋值给其他字段。

函数语法/格式

ext_regex(field,regex="regex",output=输出字段,mode="overwrite")

参数说明如下:

参数

参数类型

是否必选

默认值

取值范围

说明

field

String

/

/

待提取值的字段名称。如果指定的字段不存在,则不进行任何操作。

regex

String

/

/

用于提取字段的正则表达式。符合正则表达式规则的字段值将被提取。

output

String

/

/

匹配后输出字段。如果指定的字段不存在,则不进行任何操作。如果指定多个字段,则需要用英文逗号分隔。

mode

String

fill

  • overwrite
  • fill

指定值对输出字段的覆盖模式。

  • overwrite: 在任何情况下均默认覆盖写入。
  • 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"
    }
    

ext_grok 函数

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