跳到主要内容
版本:3.7.0

字段拆分

对不同结构数据的拆分成 Json 格式,发觉数据中有价值的信息。

关键术语

关键术语描述
Json拆分一种基于Json数据封装的函数语法,可以在Json结构中拆分出需要的字段信息。
Grok拆分一种基于正则表达式封装的函数语法,常用于日志数据关键信息提取时使用。
结构数据数据本身已经是非常规则的KV结构。
半结构数据非结构数据,但数据本身也有一定的特性,按照一定规则可以分割出原子信息。
无序数据非结构数据,数据完全无序,也没有特性规则。

前置条件

  • 分析业务中的数据,包含哪些信息,需要处理到什么样的结果。
  • ONE平台上接收的数据源中的原始数据,均封装在 _Message 字段中,同时添加一个 _Timestamp 字段来表示数据的接收时间。

开始使用

选择被拆分字段

组件支持配置多个字段的拆分,每次只能拆分一个字段。

dataparsing

设置拆分方式

支持 Json 格式数据拆分、自定义文本拆分、grok解析器拆分。

  • Json格式拆分:被拆分字段是Json数据类型,将Json按选择的Key进行拆分。

    dataParsingJson

  • 自定义文本拆分:可根据设定的文本分隔符进行数据切割,切割出来的每个部分都拆分为单独字段。

    dataParsingSeparator

  • grok解析器:使用grok语法对文本数据进行拆分,适用于日志的文本字段的数据拆分。

    dataParsingGrok

验证

点击执行预览,在数据预览面板中查看,执行预览状态下是对数据处理的模拟,平台中不会产生真实数据。

Grok语法支持列表

语法介绍

%{Matcher:Extract:Filter} 
  • Matcher(必须): 一种规则,也可能是对另一个规则名称的引用,描述所期望的内容
  • Extract (可选): 表示Matcher匹配的文本片段捕获后的目的地标识符,若不指定,则表示只匹配,不获取结果值
  • Filter (可选): 对匹配到的结果进行转换处理

支持的Matcher

date("pattern")

目前支持的日期格式:

日期格式pattern解析结果
14:20:15HH:mm:ss22815000
02:20:15 PMhh:mm:ss a22815000
11/10/2014dd/MM/yyyy1412956800000
Thu Jun 16 08:29:03 2016EEE MMM dd HH:mm:ss yyyy1466036943000
Tue Nov 1 08:29:03 2016EEE MMM d HH:mm:ss yyyy1477960143000
06/Mar/2013:01:36:30 +0900dd/MMM/yyyy:HH:mm:ss Z1468407336000
2016-11-29T16:21:36.431+0000yyyy-MM-dd'T'HH:mm:ss.SSSZ1480436496431
2016-11-29T16:21:36.431+00:00yyyy-MM-dd'T'HH:mm:ss.SSSZZ1480407696431
06/Feb/2009:12:14:14.655dd/MMM/yyyy:HH:mm:ss.SSS1233893654655
2007-08-31 19:22:22.427 ADTyyyy-MM-dd HH:mm:ss.SSS z1188598942427
2023-04-13 22:01:10yyyy-MM-dd HH:mm:ss1681394470000
2023/04/13 22:01:10yyyy/MM/dd HH:mm:ss1681394470000
2023-04-13 22:01:10.211yyyy-MM-dd HH:mm:ss.SSS1681394470211
2023-04-13 22:01:10,211yyyy-MM-dd HH:mm:ss,SSS1681394470211
2023-Apr-20 09:49:18.813567yyyy-MMM-dd HH:mm:ss.SSSSSS1681955358000
13/Jul/2016:10:55:36 +0000dd/MMM/yyyy:HH:mm:ss Z1468407336000
2017-12-29T12:33:33.095243Zyyyy-MM-dd'T'HH:mm:ss.SSSSSSZ1514522013095
25 Apr 2023 10:16:52.612dd MMM yyyy HH:mm:ss.SSS1682389012612
2016-06-15 7:53:33yyyy-MM-dd H:mm:ss1465948413000
08 Jan 17:55:41.572dd MMM HH:mm:ss.SSS1673171741572
05-04 10:30:49.710MM-dd HH:mm:ss.SSS1683167449710

regex("pattern")

  1. pattern为正则表达式,使用时请注意特殊字符的转义问题
  2. 正则表达式语法:正则表达式 – 语法 | 菜鸟教程 (runoob.com)

notSpace

匹配任何非空白字符。等价于 " ^ \f\n\r\t\v "。

boolean("truePattern", "falsePattern")

匹配truePattern时,值为true;匹配falsePattern时,值为false

uuid

匹配64位格式的uuid,e.g:8fb9c71d-817b-4a6a-8fea-546860f258b5。

mac

匹配MAC地址。

ipv4

匹配IPV4地址。

ipv6

匹配IPV6地址。

ip

相当于ipv4或ipv6。

port

匹配服务器端口,1-65535。

word

匹配A-Z, a-z, 0-9的字符,包括_(下划线)字符。

data

  1. 匹配任何字符串,包括空格和换行。相当于正则表达式中的[\s\S]*?,当以上模式都不合适时使用。
  2. 注:此matcher默认使用的?符号属于懒惰模式,即最小匹配;当此matcher处于最后一个时才会变成贪婪模式,即最多匹配。

支持的Filter:

number

将匹配项解析为双精度数。

integer

将匹配项解析为整数。

boolean

将' true '和' false '字符串解析为忽略大小写的布尔值。

nullIf("value")

如果匹配值等于提供的值,则返回null。

lowercase

全部转小写。

uppercase

全部转大写。

json

将json字符串转为map的kv结构,支持两种语法格式:

1. %{data:aaa:json}
2. %{data::json}

url

  1. 解析URL并在JSON对象中返回所有标记化的成员(域、查询参数、端口等)。
  2. Grok语法:
r %{data:mapping:url}

解析目标:

http://localhost:8082/deploy/config/collection/log/dataprocessing
{
"mapping": {
"url": "http://localhost:8082/deploy/config/collection/log/dataprocessing",
"scheme": "http",
"host": "localhost",
"port": 8082,
"path": "/deploy/config/collection/log/dataprocessing"
}
}

keyvalue

字符串形式keyvalue写法结果备注
key=valueStr%{data::keyvalue}{“key”: “valueStr”}单k:v切分
key:valueStr%{data::keyvalue(":")}{“key”: “valueStr”}
key=valueStr%{data::keyvalue("=")}{“key”: “valueStr”}
key1: value1,key2: value2%{data::keyvalue(": ", ",")}{key1: value1, key2: value2}多k:v切分

子规则说明

  • helper rule又称为子规则,理论上是解析规则的一个补充引用
  • 子规则的extract,也就是别名也会作为提取后的字段名称展示
  • 子规则之间是可以被其它子规则引用的
  • 需要注意的是,规则可以引用子规则,但子规则不能引用规则的解析式,防止递归无限死循环

示例:

日志原文:

com.bonree.one.Task.class INFO 2023-04-20 15:02:02 log

解析规则:

auto %{r:single}

子规则:

r %{data:className} %{word:level} %{ot:timestamp} log
ot %{date("yyyy-MM-dd HH:mm:ss"):timestampgg}

解析结果:

{
"single": "com.bonree.one.Task.class INFO 2023-04-20 15:02:02 log",
"timestampgg": 1681974122000,
"level": "INFO",
"className": "com.bonree.one.Task.class",
"timestamp": "2023-04-20 15:02:02"
}