云日志服务 LTS-字段值提取函数:e_json

时间:2024-09-11 10:44:56

e_json

对特定字段中的JSON对象进行JSON操作,包括JSON展开、JMES提取或者JMES提取后再展开。

  • 函数格式
    e_json(key, expand=None, depth=100, prefix="__", suffix="__", fmt="simple", sep=".",
           expand_array=true, fmt_array="{parent}_{index}",
           include_node=r"[\u4e00-\u9fa5\u0800-\u4e00a-zA-Z][\w\-\.]*",
            exclude_node="", include_path="", exclude_path="",
         jmes="", output="", jmes_ignore_none=false, mode='fill-auto'
    )
  • 参数说明

    参数名称

    参数类型

    是否必填

    说明

    key

    String

    源字段名。如果字段不存在,则不进行任何操作。

    expand

    Boolean

    是否将字段展开。

    • 没有配置jmes参数时,则默认为true,表示展开。
    • 配置jmes参数时,则默认为false,表示不展开。

    depth

    Number

    字段展开的深度。取值范围为1~2000,1表示只展开第一层,默认为100层。

    prefix

    String

    展开时添加为字段名的前缀。

    suffix

    String

    展开时添加为字段名的后缀。

    fmt

    String

    格式化方式。取值:

    • simple(默认值):表示将节点名作为字段名。展示形式为{prefix}{current}{suffix}。
    • full:表示将父节点与当前节点合并作为字段名。展示形式为{parent_list_str}{sep}{prefix}{current}{suffix}。分隔符是由sep参数指定,默认为.。
    • parent:表示用完整的路径作为字段名。展示形式为{parent}{sep}{prefix}{current}{suffix}。分隔符是由sep参数指定,默认为.。
    • root:表示将根节点与当前节点合并作为字段名。展示形式为{parent_list[0]}{sep}{prefix}{current}{suffix}。分隔符由sep参数指定,默认为.。

    sep

    String

    父子节点格式化的分隔符。当fmt取值为full、parent或root时需要设置。默认为.。

    expand_array

    Boolean

    是否将数组展开。默认为true表示展开数组。

    fmt_array

    String

    数组展开的格式化方式,格式为{parent_rlist[0]}_{index}。也可以使用最多五个占位符自定义格式化字符串:parent_list,current,sep,prefix,suffix。

    include_node

    String/ Number

    节点允许名单,表示过滤时包含的节点名称。默认只有中文、数字、字母和_.-的节点才会被自动展开。

    exclude_node

    String

    节点限制名单,表示过滤时排除的节点名称。

    include_path

    String

    节点允许名单,表示过滤时包含的节点路径。

    exclude_path

    String

    节点限制名单,表示过滤时排除的节点路径。

    jmes

    String

    将字段值转化为JSON对象并通过JMES提取特定值。

    output

    String

    通过JMES提取特定值时输出的字段名。

    jmes_ignore_none

    Boolean

    当JMES提取不到值时是否忽略。默认为true表示忽略,否则输出一个空字符串。

    mode

    String

    字段的覆盖模式。默认为fill-auto。

    • JSON展开过滤
      • 如果设置了节点允许名单,则内容必须包含在节点允许名单中然后才会在结果中出现。节点允许名单正则示例:e_json("json_data_filed", ...., include_node=r'key\d+')。
      • 如果设置了节点限制名单,则内容必须包含在节点限制名单中然后才不会在结果中出现。节点限制名单正则示例:e_json("json_data_filed", ...., exclude_node=r'key\d+')。
      • 展开节点路径:正则include_path 与 exclue_path从路径开头匹配,匹配路径是以.分隔。
    • JMES过滤

      使用JMES选择、计算。

      • 选择特定JSON路径下的元素属性列表:e_json(..., jmes="cve.vendors[*].product",output="product")
      • 用逗号拼接特定JSON路径下的元素属性:e_json(..., jmes="join(',', cve.vendors[*].name)",output="vendors")
      • 计算特定JSON路径下元素的最大属性值:e_json(..., jmes="max(words[*].score)",output="hot_word")
      • 当特定路径不存在或为空时,返回一个空字符串:e_json(..., jmes="max(words[*].score)",output="hot_word", jmes_ignore_none=false)
    • parent_list和parent_rlist,以如下示例说明。

      测试数据:

      {
       "data": { "k1": 100,"k2": {"k3": 200,"k4": {"k5": 300}}}
      }

      parent_list是将父节点从左到右排列。

      e_json("data", fmt='{parent_list[0]}-{parent_list[1]}#{current}')

      得到的日志:

      data:{ "k1": 100,"k2": {"k3": 200,"k4": {"k5": 300}}}
      data-k2#k3:200
      data-k2#k5:300

      parent_rlist是将父节点从右到左排列。

      e_json("data", fmt='{parent_rlist[0]}-{parent_rlist[1]}#{current}')

      得到的日志:

      data:{ "k1": 100,"k2": {"k3": 200,"k4": {"k5": 300}}}
      k2-data#k3:200
      k4-k2#k5:300
  • 返回结果

    返回附带新字段值的日志。

  • 函数示例
    1. 示例1:字段展开操作。
      • 测试数据
        {
         "data": {"k1": 100, "k2": 200}
        }
      • 加工规则
        e_json("data",depth=1)
      • 加工结果
        data: {"k1": 100, "k2": 200}
        k1: 100
        k2: 200
    2. 示例2:给字段名添加前缀和后缀。
      • 测试数据
        {
         "data": {"k1": 100, "k2": 200}
        }
      • 加工规则
        e_json("data", prefix="data_", suffix="_end")
      • 加工结果
        data: {"k1": 100, "k2": 200}
        data_k1_end: 100
        data_k2_end: 200
    3. 示例3:将字段按照不同格式展开。
      • 测试数据
        {
         "data": {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } }
        }
      • fmt=full格式
        e_json("data", fmt='full')
        data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } } 
        data.k1: 100 
        data.k2.k3: 200 
        data.k2.k4.k5: 300
      • fmt=parent格式
        e_json("data", fmt='parent')
        data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } } 
        data.k1: 100 
        k2.k3: 200 
        k4.k5: 3000
      • fmt=root格式
        e_json("data", fmt='root')
        data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } } 
        data.k1: 100 
        data.k3: 200 
        data.k5: 300
    4. 示例4:使用指定分隔符、字段名前缀和字段名后缀提取JSON
      • 测试数据
        {
         "data": {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } }
        }
      • 加工规则
        e_json("data", fmt='parent', sep="@", prefix="__", suffix="__")
      • 加工结果
        data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } } 
        data@__k1__:100 
        k2@__k3__:200 
        k4@__k5__:300
    5. 示例5:指定fmt_array参数,按照数组方式提取JSON。
      • 测试数据
        {
         "people": [{"name": "xm", "sex": "boy"}, {"name": "xz", "sex": "boy"}, {"name": "xt", "sex": "girl"}]
        }
      • 加工规则
        e_json("people", fmt='parent', fmt_array="{parent_rlist[0]}-{index}")
      • 加工结果
        people: [{"name": "xm", "sex": "boy"}, {"name": "xz", "sex": "boy"}, {"name": "xt", "sex": "girl"}]
        people-0.name: xm 
        people-0.sex: boy 
        people-1.name: xz 
        people-1.sex: boy 
        people-2.name: xt 
        people-2.sex: girl
    6. 示例6:使用JMES提取JSON对象。
      • 测试数据
        {
         "data": { "people": [{"first": "James", "last": "d"},{"first": "Jacob", "last": "e"}],"foo": {"bar": "baz"}}
        }
      • 加工规则
        e_json("data", jmes='foo', output='jmes_output0')
        e_json("data", jmes='foo.bar', output='jmes_output1')
        e_json("data", jmes='people[0].last', output='jmes_output2')
        e_json("data", jmes='people[*].first', output='jmes_output3')
      • 加工结果
        data: { "people": [{"first": "James", "last": "d"},{"first": "Jacob", "last": "e"}],"foo": {"bar": "baz"}}
        jmes_output0: {"bar": "baz"}
        jmes_output1: baz 
        jmes_output2: d 
        jmes_output3: ["james", "jacob"]
  • 更多参考

    支持和其他函数组合使用。

support.huaweicloud.com/usermanual-lts/lts_07_0162.html