本文档介绍如何使用SPL语句提取字符串键值对。
关键字提取
字符串动态键值对提取分为关键字提取、值提取、关键字加工和值加工。常用方案为采用parse-kv指令。以k1: q=asd&a=1&b=2&1=3
日志为例,对该格式的日志进行关键字和值提取。
原始日志
k1: q=asd&a=1&b=2&__1__=3
SPL语句
* | parse-kv -delims='&' k1
结果
k1: q=asd&a=1&b=2 q: asd a: 1 b: 2 __1__: 3
值提取
动态键值对之间以及关键字与值之间有明确标识,例如a=b
或a="cxxx"
的日志格式,推荐用parse-kv指令,示例如下。
原始日志
content1: k="helloworld",the change world, k2="good"
提取内容不包括
the change world
,SPL语句如下:* | parse-kv -delims=',\s' content1
结果
content1: k="helloworld",the change world, k2="good" k1: helloworld k2: good
关键字加工
parse-kv指令可以通过prefix=""
对关键字和值进行加工。
原始日志
k1: q=asd&a=1&b=2
SPL语句
* | parse-kv -delims='&' -prefix='start_' k1
结果
k1: q=asd&a=1&b=2 start_a: 1 start_b: 2 start_q: asd
值加工
日志格式为k1:"v1"abc"
形式,值加工的内容存在双引号符号时,使用parse-kv指令可正常进行提取。
原始日志
""" 这里的\只是普通的符号,不是转义符 """ content2: k1:"v1\"abc", k2:"v2", k3:"v3"
SPL语句
* | parse-kv -delims=',\s' -kv-sep=':' content2
结果
content2: k1:"v1\"abc", k2:"v2", k3: "v3" k1: "v1\\"abc" k2: "v2" k3: "v3"
客户案例
例如某网站日志中有一个URL数据,针对这条数据有提取需求,按照需求设计加工规则处理日志内容。
需求
需求1:对日志解析出
proto
、domain
、param
等内容。需求2:对
param
中的键值对做展开操作。
原始日志
__source__: 10.43.xx.xx __tag__:__client_ip__: 12.120.xx.xx __tag__:__receive_time__: 1563517113 __topic__: request: https://yz.m.sm.cn/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0
SPL方案
* | parse-regexp request, '([^:]+)://([^/]+)(.+)' as uri_proto, uri_domain, uri_param | parse-regexp uri_param, '([^?]*)\?(.*)' as uri_path,uri_query | parse-kv -delims='&?' uri_query
细分规则及对应的加工结果
使用parse-regexp指令对字段
request
进行解析。使用非命名正则捕获
* | parse-regexp request, '([^:]+)://([^/]+)(.+)' as uri_proto, uri_domain, uri_param
对应加工结果
uri_proto: https uri_domain: yz.m.sm.cn uri_param: /video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0
使用parse-regexp指令对字段
uri_param
进行解析。使用非命名正则捕获
* | parse-regexp uri_param, '([^?]*)\?(.*)' as uri_path,uri_query
对应加工结果
uri_path: /video/getlist/s uri_query: ver=3.2.3&app_type=supplier&os=Android8.1.0
对
uri_param
进行字段提取,具体操作如下。使用非命名正则捕获
* | parse-kv -delims='&?' uri_query
对应加工结果
uri_proto: https uri_domain: yz.m.sm.cn uri_param: /video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0
SPL结果预览处理后日志
__source__: 10.43.xx.xx __tag__:__client_ip__: 12.120.xx.xx __tag__:__receive_time__: 1563517113 __topic__: request: https://yz.m.sm.cn/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 uri_domain: yz.m.sm.cn uri_path: /video/getlist/s uri_proto: https uri_query: ver=3.2.3&app_type=supplier&os=Android8.1.0 app_type: supplier os: Android8.1.0 ver: 3.2.3
假如只有解析request需求,可以直接对字段
request
使用parse-kv指令。例如:* | parse-kv -delims='&?' request
预览处理后日志:
__source__: 10.43.xx.xx __tag__:__client_ip__: 12.120.xx.xx __tag__:__receive_time__: 1563517113 __topic__: request: https://yz.m.sm.cn/video/getlist/s?ver=3.2.3&app_type=supplier&os=Android8.1.0 app_type: supplier os: Android8.1.0 ver: 3.2.3