全部产品
阿里云办公

内置切分器

更新时间:2018-08-29 15:31:15

本文介绍了 ARMS 的内置切分器,包括单分隔符、多分隔符、顺序、KV、JSON 等多种切分器。您可以针对不同的场景单独或组合使用这些切分器。

单分隔符切分器

说明

将单一字符串作为输入,当匹配到用户指定的分隔字符串时进行切分,切分结果为多个键值对(Key-Value)。

示例

样例日志:

  1. 2016-11-08 11:00:01|user_abc|123456|下单
  2. 2016-11-08 11:00:02|user_abc|123456|支付
  3. 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)。

示例

样例日志:

  1. 2014-07-25 17:25:00,aaa|b~1
  2. 2014-07-25 17:26:00,aaa|b~1

自定义切分逻辑:

切分结果:

顺序分隔符切分器

说明

对于较复杂的切分场景(例如 accesslog),可以使用 ARMS 的顺序分隔符切分器,以 O(n) 的复杂度切分日志。

示例

样例日志:

  1. 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
  2. 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

样例日志:

  1. key1=aaaa;key2=bbbb;key3=cccc;key4=dddd;....
  2. key1=aaaa;key2=bbbb;key3=cccc;key4=dddd;....

切分逻辑:

注意:

  • 如果没有配置文本字符与 Key 的映射,KV 切分器将视所有 Key 为“未定义 key”,所有 Key 对应的 Value 将被切分为 StringKey 类型。

  • 如果选择取消勾选是否切分未定义的 Key,那么未定义 Key 将不会被切分。换言之,如果没有配置文本字符与 Key 的映射,并且未勾选是否切分未定义的 Key,则 KV 切分器将不做任何处理。

示例 2

以下是一个需要将指定 Key 转换成对应类型的示例:

样例日志:

  1. name=abc;item=iphone6;quantity=15;date=2014-07-25 17:25:00;....
  2. name=abc;item=iphone6;quantity=15;date=2014-07-25 17:25:00;....

目标是将 quantity 变为 LongKey,date 变为 DateKey。切分逻辑:

JSON 切分器

说明

如果日志中包含 JSON 字符串,使用 JSON 切分器可以快速切分出该 JSON 中的叶子节点。

示例 1:全自动切分

样例日志:

  1. {
  2. "title": "Example Schema",
  3. "type": "object",
  4. "quantity": 200,
  5. "date":"2015-12-12 12:12:12",
  6. "properties": {
  7. "firstName": {
  8. "type": "string"
  9. },
  10. "lastName": {
  11. "type": "string"
  12. },
  13. "age":
  14. "description": "Age in years",
  15. "type": "integer",
  16. "minimum": 0
  17. }
  18. },
  19. "required": ["firstName", "lastName"]
  20. }

将该 JSON 放在一行文本中,使用 JSON 切分器进行切分。切分逻辑:

切分结果:

切分逻辑说明:

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

注意: 本例中的 required 字段由于是 Array 类型,所以没有切分。另外,date 字段默认转化为 String 类型。

示例 2:自定义切分

如果只需要切分 JSON 中的指定字段,可以这样配置切分逻辑:

切分结果:

切分逻辑说明:

本例中未勾选是否切分未定义的 Key,并自定义了 title、date 和 quantity 三个字段,且指定了类型。因此 ARMS 会只切分自定义的字段,并转换成对应的类型(本例中 date 字段被转成了 ARMS 内置的 Long 型)。