全部产品
阿里云办公

内置切分器

更新时间:2018-01-22 15:44:27

本文介绍了 ARMS 的内置切分器。

ARMS 内置单分隔符、多分隔符、顺序、K-V、JSON 等多种切分器,针对不同的场景可以单独或组合使用。

单分隔符切分器

说明

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

实例

样例日志如下所示:

  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|退货

其自定义切分如下所示:

s1

配置说明:

  • 以“|”为分隔符
  • 切分后 0 号位置的字符串按照 yyyy-MM-dd HH:mm:ss 的格式转为 date(内部实际将以 Long 型保存)
  • 1 号位置的字符串转为 key 为 username 的 String
  • 2 号位置转为 key 为 userid 的 Long
  • 3 号位置保存为 key 为 event 的 String

注意:

  • 对不可见字符的支持:本切分器支持不可见字符的切分,例如 \t、\u001f(ascii char=31)。一些不可见字符的切分将无法在页面测试中被正确验证(因为页面文本框内无法正确输入不可见字符),所以建议在测试页面先使用可见字符进行调试,然后换成不可见字符保存后进行部署。

  • 多字符分隔符:本切分器分隔符可以为多字符,如a::b::c为输入,以::为分隔符切分。

  • 切分模型包含 _line 字段与 _hostIp 字段,具体请参考日志清洗中系统字段介绍

多分隔符切分器

说明

将单一字符串作为输入,当匹配任意一个用户指定分隔字符时进行切分,切分结果为多个键值对。

实例

样例日志:

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

自定义切分如下所示:

s3

每行日志的切分如下所示:

s4

切分模型如下所示:

7777

顺序分隔符切分器

说明

针对较复杂的切分场景(如 accesslog),ARMS 提供了顺序分隔符切分器,以 O(n) 的复杂度来切分日志。

实例

样例日志:

  1. 117.74.77.48 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.74.87.58 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 字段、平均响应时间、时间、请求的 URL:

=> [ url - http://trade.taobao.com/trade/detail/trade_snap.htm?spm=a1z0f.2.100003.9.8BpicQ&trade_id=664793864233811 ] [ _hostIp - 127.0.0.1 ] [ ip - 117.74.77.48 ] [ date - 1401084328000 ] [ rt - 835158 ]

我们会发现:

  • 用单分隔符切分器显然无法满足需求。

  • 用多分隔符切分器也不能满足需求:我们如果想切出rt=835158这组 KV(键值对),必须以“ ”(空格)作为切分字符之一,但是这样做会错误地把26 May 2014:14:05:28 +0800这个字符串切成几段,因此我们将无法得到date - 1401084328000

  • 如果使用正则表达式来匹配 KV,效率太低,需要遍历多次。

ARMS 提供了“顺序分隔符切分”的方式。使用如下配置,就可以得到本示例正确的结果。具体配置方式如下所示:

s5

先定义 5 个分隔符字符串,并依次将输入字符串切分为 6 段子串,随后将指定的子串分别赋给不同的 Key,即可达成目标切分效果。

KV 切分器

如果需要切分如下所示的多组 Key=Value 形式的日志:

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

且各个 Key-Value 的位置不固定时,可以使用 KV 切分器:

切分配置如下:

s6

注意:

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

  • 如果取消勾选是否切分未定义的 Key,那么未定义 Key 将不会被切分。换言之,如果没有配置文本字符 <-> Key 映射,并且未勾选是否切分未定义的 Key,本切分器将不执行任何操作。

接下来展示一个需要将指定的 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:

s7

JSON 切分器

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

例一:全自动切分

  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 切分器进行切分:

s8

切分结果如下:

2222

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

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

例二:自定义切分

如果只想切分 JSON 中指定的某些字段,可以这样配置:

s9

其切分模型如下:

4444

本例中取消勾选了是否切分未定义的 Key,自定义了titledatequantity三个字段,并指定了类型。ARMS 会只切分自定义的字段,并转成对应的类型(本例中date字段被转成了 ARMS 内置的 Long 型)。

本文导读目录