提取字符串动态键值对

本文档介绍如何使用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=ba="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:对日志解析出protodomainparam等内容。

    • 需求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
  • 细分规则及对应的加工结果

    1. 使用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
    2. 使用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
    3. 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