本文介绍了 ARMS 的内置切分器,包括单分隔符、多分隔符、顺序、KV、JSON 等多种切分器。您可以针对不同的场景单独或组合使用这些切分器。
单分隔符切分器
说明
将单一字符串作为输入,当匹配到用户指定的分隔字符串时进行切分,切分结果为多个键值对(Key-Value)。
示例
样例日志:
2016-11-08 11:00:01|user_abc|123456|下单
2016-11-08 11:00:02|user_abc|123456|支付
2016-11-08 11:10:01|user_abc|123456|退货
自定义切分逻辑:

切分逻辑说明:
- 以竖线(|)为分隔符,以 _line 作为入参(_line 代表原始日志行本身)。
- 切分后 0 号位置的字符串按照
yyyy-MM-dd HH:mm:ss
的格式转为 date (内部实际将以 Long 型保存)。 - 1 号位置的字符串转为以 username 为 Key 的字符串。
- 2 号位置转为以 userid 为 Key 的 Long。
- 3 号位置转为以 event 为 Key 的字符串。
-
对不可见字符的支持:本切分器支持不可见字符的切分,例如 \t,\u001f(ASCII char=31)。因为无法在浏览器里粘贴不可见字符,所以您只能暂时将测试文本的分隔符替换为可见字符进行测试。全部流程测试通过后,再将分隔符替换为不可见字符进行部署。
-
多字符分隔符:本切分器分隔符可以是多字符。例如以
a::b::c
为输入,以::
为分隔符切分。 -
切分模型包含 _line 字段和 _hostIp 字段。详情请参见日志清洗中的系统字段。
多分隔符切分器
说明
将单一字符串作为输入,当匹配到用户指定的任意一个分隔字符串时进行切分,切分结果为多个键值对(Key-Value)。
示例
样例日志:
2014-07-25 17:25:00,aaa|b~1
2014-07-25 17:26:00,aaa|b~1
自定义切分逻辑:

切分结果:

顺序分隔符切分器
说明
对于较复杂的切分场景(例如 accesslog),可以使用 ARMS 的顺序分隔符切分器,以 O(n) 的复杂度切分日志。
示例
样例日志:
117.xx.xx.xx 835158 - [26 May 2014:14:05:28 +0800] "GET http://trade.taobao.com/trade/detail/trade_snap.htm?spm=a1z0f.2.100003.9.8BpicQ&trade_id=664793864233811" 302 0
117.xx.xx.xx 835158 - [26 May 2014:14:05:28 +0800] "GET http://trade.taobao.com/trade/detail/trade_snap.htm?spm=a1z0f.2.100003.9.8BpicQ&trade_id=664793864233811" 302 0
需要切分出的字段有:
- IP:117.xx.xx.xx
- 平均响应时间:835158
- 时间:1401084328000
- 请求的 URL:
http://trade.taobao.com/trade/detail/trade_snap.htm?spm=a1z0f.2.100003.9.8BpicQ&trade_id=664793864233811
我们会发现:
-
单分隔符切分器显然无法满足需求。
-
多分隔符切分器也不能满足需求。如果要切分出 rt=835158 这一对 KV,必须以空格作为切分字符之一,但是这样做会错误地把
26 May 2014:14:05:28 +0800
这个字符串切分成几段,因此我们将无法得到 date - 1401084328000。 -
如果使用正则表达式来匹配 KV,则需要遍历多次,效率太低。
ARMS 提供了顺序分隔符切分器,可以满足本示例的需求。切分逻辑:

切分逻辑说明:
先定义了 5 个分隔符字符串,并依次将输入字符串切分为了 6 段子串,随后将指定的子串分别赋给不同的 key,即可达到目标切分效果。
KV 切分器
说明
如果需要切分含有多组 KV 的日志,且各个 KV 的位置不固定时,可以使用 KV 切分器。
示例 1
样例日志:
key1=aaaa;key2=bbbb;key3=cccc;key4=dddd;....
key1=aaaa;key2=bbbb;key3=cccc;key4=dddd;....
切分逻辑:

-
如果没有配置文本字符与 Key 的映射,KV 切分器将视所有 Key 为“未定义 key”,所有 Key 对应的 Value 将被切分为 StringKey 类型。
-
如果选择取消勾选是否切分未定义的 Key,那么未定义 Key 将不会被切分。换言之,如果没有配置文本字符与 Key 的映射,并且未勾选是否切分未定义的 Key,则 KV 切分器将不做任何处理。
示例 2
以下是一个需要将指定 Key 转换成对应类型的示例:
样例日志:
name=abc;item=iphone6;quantity=15;date=2014-07-25 17:25:00;.... name=abc;item=iphone6;quantity=15;date=2014-07-25 17:25:00;....

JSON 切分器
说明
如果日志中包含 JSON 字符串,使用 JSON 切分器可以快速切分出该 JSON 中的叶子节点。
示例 1:全自动切分
样例日志:
{
"title": "Example Schema",
"type": "object",
"quantity": 200,
"date":"2015-12-12 12:12:12",
"properties": {
"firstName": {
"type": "string"
},
"lastName": {
"type": "string"
},
"age":
"description": "Age in years",
"type": "integer",
"minimum": 0
}
},
"required": ["firstName", "lastName"]
}

切分结果:

切分逻辑说明:
由于勾选了是否切分未定义的 Key,JSON 切分器将自动切出所有非 Array 类型的叶子节点,并自动转换成对应类型(StringKey 或 LongKey)。
示例 2:自定义切分

切分结果:

切分逻辑说明:
本例中未勾选是否切分未定义的 Key,并自定义了 title、date 和 quantity 三个字段,且指定了类型。因此 ARMS 会只切分自定义的字段,并转换成对应的类型(本例中 date 字段被转成了 ARMS 内置的 Long 型)。
在文档使用中是否遇到以下问题
更多建议
匿名提交