本文档主要介绍字段值提取函数的语法规则,包括参数解释、函数示例等。

函数列表

类型 函数 说明
正则提取 e_regex 根据正则表达式提取事件字段的值并赋值给其他事件字段。
JSON提取 e_json 对事件特定字段中的JSON对象进行JSON操作,包括JSON展开、JMES提取或者JMES提取后再展开。
分隔符提取 e_csv,e_psv,e_tsv 使用自定义的分隔符与预定义的字段名,从特定字段中提取多个字段。
  • e_csv:默认分隔符为,
  • e_psv:默认分隔符为|
  • e_tsv:默认分隔符\t
KV模式提取 e_kv 通过quote提取多个源字段中的键值对信息。
e_kv_delimit 通过分隔符提取源字段中的键值对信息。
Syslog标准提取 e_syslogrfc 根据Syslog协议由已知priority值计算出facility和severity,并且匹配相应的level信息。

e_regex

  • 函数格式
    e_regex(源字段名, 有命名捕获正则)
    e_regex(源字段名, 无捕获正则, 目标fields_info(目标字段名)
    e_regex(源字段名, 无捕获正则, 目标fields_info(目标字段名数组)
    e_regex(源字段名, 有捕获正则, 目标fields_info(目标字段名数组)
    e_regex(源字段名, 有捕获正则, 目标fields_info(目标键值字典)
    e_regex(...上述参数...mode="fill-auto")
  • 参数说明
    参数名称 参数类型 是否必填 说明
    源字段名 任意 任意字符。如果字段在事件中不存在,则不进行任何操作 。特殊字段名的设置请参见事件类型
    正则表达式 String 提取字段的正则表达式 。
    说明 非捕获有时需要使用分组,且使用前缀?:。例如 \w+@\w+\.\w(?:\.\cn)?。关于分组不捕获请参见非捕获组
    fields_info String/ List/ Dict 匹配后目标字段名。当有正则表达式参数没有配置命名捕获时必须填写。
    mode String 字段的覆盖模式。默认为fill-auto。关于更多字段值及含义请参见字段提取检查与覆盖模式
  • 返回结果

    返回附带了新字段值的事件。

  • 示例1:单值提取。
    原始日志:
    msg:  192.168.1.1 http://... 127.0.0.0
    加工规则:
    e_regex("msg",r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}","ip")
    加工结果:
    msg:  192.168.1.1 http://... 127.0.0.0
    ip:  192.168.1.1
  • 示例2:多值提取。
    原始日志:
    msg:  192.168.1.1 http://... 127.0.0.0
    加工规则:
    e_regex("msg",r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",["server_ip","client_ip"])
    加工结果:
    msg:  192.168.1.1 http://... 127.0.0.0
    server_ip:  192.168.1.1
    client_ip:  127.0.0.0
  • 示例3:捕获。
    原始日志:
    content:  start sys version: deficience, err: 2
    加工规则:
    e_regex("content",r"start sys version: (\w+),\s*err: (\d+)",["version","error"])
    加工结果:
    content:  start sys version: deficience, err: 2
    error:  2
    version:  deficience
  • 示例4:命名捕获。
    原始日志:
    content:  start sys version: deficience, err: 2
    加工规则:
    e_regex("content",r"start sys version: (?P<version>\w+),\s*err: (?P<error>\d+)")
    加工结果:
    content:  start sys version: deficience, err: 2
    error:  2
    version:  deficience
  • 示例5:动态字段名提取。
    原始日志:
    dict:  varify:123
    加工规则:
    e_regex("dict",r"(\w+):(\d+)",{r"k_\1": r"v_\2"})
    加工结果:
    dict:  varify:123
    k_varify:  v_123

e_json

  • 函数格式
    e_json(源字段名, 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'
    )
  • 参数说明
    参数名称 参数类型 是否必填 说明
    源字段名 String 任意字符。如果字段在事件中不存在,则不进行任何操作。特殊字段名的设置请参见事件类型
    expand Bool 是否将字段展开。
    • 没有配置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取值为fullparentroot时需要设置。默认为.
    expand_array Bool 数组展开的格式化方式, 格式为{parent}_{index}
    fmt_array String 数组展开的格式化方式,格式为{parent_rlist[0]}_{index}。也可以使用最多五个占位符自定义格式化字符串:parent_listcurrentsepprefixsuffix
    include_node String/ Number 白名单,表示过滤时包含的节点名称。默认只有中文、数字、字母和_.-的节点才会被自动展开。
    exclude_node String 黑名单,表示过滤时排除的节点名称。
    include_path String 白名单,表示过滤时包含的节点路径。
    exclude_path String 黑名单,表示过滤时排除的节点路径。
    jmes String 将字段值转化为JSON对象并通过JMES提取特定值。
    output String 通过JMES提取的值的输出字段名。
    jmes_ignore_none Bool 当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: ...如上...
      data-k2#k3: 200
      data-k2#k5: 300
    • parent_rlist是将父节点从右到左排列。
      e_json("data", fmt='{parent_list[1]}-{parent_list[0]}#{current}')
      得到的日志为:
      data: ...如上...
      data-k2#k3: 200
      k2-k4#k5: 300
  • 返回结果

    返回附带了新字段值的事件。

  • 函数示例
    • 示例1:字段展开操作。
      原始日志:
      data: {"k1": 100, "k2": 200}
      加工规则:
      e_json("data",depth=1)
      加工结果:
      data: {"k1": 100, "k2": 200}
      k1: 100
      k2: 200
    • 示例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:将字段按照不同格式展开。
      原始日志:
      data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } }
      加工规则:
      e_json("data", fmt='full')
      e_json("data", fmt='parent')
      e_json("data", fmt='root')
      加工结果:
      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格式:
        data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } }
        data.k1: 100
        k2.k3: 200
        k4.k5: 300
      fmt=root格式:
        data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } }
        data.k1: 100
        data.k3: 200
        data.k5: 300
    • 示例4:sep,prefix,suffix的综合使用。
      原始日志:
      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:fmt_array的使用。
      原始日志:
      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:JMES的使用。
      原始日志:
      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')
      加工结果:
      jmes_output0: {"bar": "baz"}
      jmes_output1: baz
      jmes_output2: d
      jmes_output3: ["james", "jacob"]
      data: { "people": [{"first": "James", "last": "d"}, 
                           {"first": "Jacob", "last": "e"}],  
                "foo": {"bar": "baz"}
              }

e_csv,e_psv,e_tsv

  • 函数格式
    e_csv(源字段名, 目标字段列表, sep=",", quote='"', restrict=True, mode="fill-auto")
    e_psv(源字段名, 目标字段列表, sep="|", quote='"', restrict=True, mode="fill-auto")
    e_tsv(源字段名, 目标字段列表, sep="\t", quote='"', restrict=True, mode="fill-auto")
  • 参数说明
    参数名称 参数类型 是否必填 说明
    源字段名 任意 任意字符。如果字段在事件中不存在,则不进行任何操作。特殊字段名的设置请参见事件类型
    目标字段列表 任意 字段值经过分隔符分隔后的每个值对应的字段名。

    可以是字符串的列表,例如:["error", "message", "result"]

    当字段名中不包含逗号时,也可以直接用逗号作为分隔字符,例如:"error, message, result"

    sep String 分隔符,只能是单个字符。
    quote String 将值括起来的字符,当值包含分隔符时需要使用。
    restrict Bool 是否采用严格模式,默认为False表示非严格模式。当分隔的值的个数与目标字段列表数不一致时:
    • 严格模式下,不进行任何操作。
    • 非严格模式下,对前几个可以配对的字段进行赋值。
    mode String 字段的覆盖模式。默认为fill-auto。关于更多字段值及含义请参见字段提取检查与覆盖模式
  • 返回结果

    返回附带了新字段值的事件。

  • 函数示例:以e_csv为例,e_psve_tsv功能类似。
    原始日志:
    content:  106.39.189.28,10/Jun/2019:11:32:16 +0800,m.aliyun.cn,GET /zf/11874.html HTTP/1.1,200,0.077,6404,10.11.186.82:8001,200,0.060,https://yz.m.aliyun.cn/s?q=%E8%9B%8B%E8%8A%B1%E9%BE%99%E9%A1%BB%E9%9D%A2%E7%9A%84%E5%81%9A%E6%B3%95&from=wy878378&uc_param_str=dnntnwvepffrgibijbprsvdsei,-,Mozilla/5.0 (Linux; Android 9; HWI-AL00 Build/HUAWEIHWI-AL00) AppleWebKit/537.36,-,-
    加工规则:
    e_csv("content2", "remote_addr, time_local,host,request,status,request_time,body_bytes_sent,upstream_addr,upstream_status, upstream_response_time,http_referer,http_x_forwarded_for,http_user_agent,session_id,guid")
    加工结果:
    content:  106.39.189.28,10/Jun/2019:11:32:16 +0800,m.aliyun.cn,GET /zf/11874.html HTTP/1.1,200,0.077,6404,10.11.186.82:8001,200,0.060,https://yz.m.aliyun.cn/s?q=%E8%9B%8B%E8%8A%B1%E9%BE%99%E9%A1%BB%E9%9D%A2%E7%9A%84%E5%81%9A%E6%B3%95&from=wy878378&uc_param_str=dnntnwvepffrgibijbprsvdsei,-,Mozilla/5.0 (Linux; Android 9; HWI-AL00 Build/HUAWEIHWI-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36,-,-
      body_bytes_sent:  6404
    guid:  -
    host:  m.aliyun.cn
    http_referer:  https://yz.m.aliyun.cn/s?q=%E8%9B%8B%E8%8A%B1%E9%BE%99%E9%A1%BB%E9%9D%A2%E7%9A%84%E5%81%9A%E6%B3%95&from=wy878378&uc_param_str=dnntnwvepffrgibijbprsvdsei
    http_user_agent:  Mozilla/5.0 (Linux; Android 9; HWI-AL00 Build/HUAWEIHWI-AL00) AppleWebKit/537.36
    http_x_forwarded_for:  -
    remote_addr:  106.39.189.28
    request:  GET /zf/11874.html HTTP/1.1
    request_time:  0.077
    session_id:  -
    status:  200
    time_local:  10/Jun/2019:11:32:16 +0800
    topic:  syslog-forwarder
    upstream_addr:  10.11.186.82:8001
    upstream_response_time:  0.060
    upstream_status:  200

e_kv

  • 函数格式
    e_kv(源字段或源字段列表, sep="=", quote='"', escape=False, prefix="", suffix="", mode="fill-auto")
  • 参数说明
    参数名称 参数类型 是否必填 说明
    源字段或源字段列表 字符串或字符串列表 字段名或多个字段名的列表。特殊字段名的设置请参见事件类型
    sep String 关键字与值的正则表达式的分隔符串,默认为=,不限于单个字符。
    说明 可以使用非捕获分组,但不能使用捕获分组。
    quote String 将值括起来的字符。默认为"
    说明 提取的动态关键字与值对的值一般需要quote来包括,例如:a="abc"b="xyz"如果提取对象中不包含,则只提取如下字符集的值:中文字母数字_-.%~。例如a=中文ab12_-.%~|abc b=123可以提取a: 中文ab12_-.%~b: 123
    escape Bool 是否自动提取反转字符的值。 默认为False表示否。例如key="abc\"xyz"默认提取字段key的值为abc\"xyz,设置escape时,提取的值为abc"xyz
    prefix String 给提取的字段名添加前缀。
    suffix String 给提取的字段名添加后缀。
    mode String 字段的覆盖模式。默认为fill-auto。关于更多字段值及含义请参见字段提取检查与覆盖模式
  • 返回结果

    返回附带了新字段值的事件。

  • 函数示例
    • 示例1:默认格式。
      原始日志:
      http_refer:  https://yz.m.sm.cn/s?q=asd&a=1&b=2
      加工规则:
      e_kv("http_refer")
      加工结果:
      http_refer:  https://yz.m.sm.cn/s?q=asd&a=1&b=2
      q: asd
      a: 1
      b: 2
    • 示例2:给字段增加前缀和后缀。
      原始日志:
      http_refer:  https://yz.m.sm.cn/s?q=asd&a=1&b=2
      加工规则:
      e_kv("http_refer",sep="=", quote='"', escape=False, prefix="data_", suffix="_end", mode="fill-auto")
      加工结果:
      http_refer:  https://yz.m.sm.cn/s?q=asd&a=1&b=2
      data_q_end: asd
      data_a_end: 1
      data_b_end: 2
    • 示例3:escape的使用。
      原始日志:
      content2: k1:"v1\"abc", k2:"v2", k3: "v3"
      加工规则:
      e_kv("content2", escape=True)
      加工结果:
      content2:  k1:"v1\"abc", k2:"v2", k3: "v3"
      k1: v1"abc
      k2: v2
      k3: v3

e_kv_delimit

  • 函数格式
    e_kv_delimit(源字段或源字段列表, pair_sep=r"\s", kv_sep="=", prefix="", suffix="", mode="fill-auto")
  • 参数说明
    参数名称 参数类型 是否必填 说明
    源字段或源字段列表 字符串或字符串列表 字段名或多个字段名的列表。特殊字段名的设置请参见事件类型
    pair_sep String 用于分隔键值对的正则字符集,默认为\s。如\s\w abc\s等,但不是子串,任意满足的字符会分隔键值对。
    kv_sep String 用于分隔KV的正则字符串,默认为=,不限于单个字符。
    说明 可以使用非捕获分组,但不能使用捕获分组。
    prefix String 给提取的字段名添加前缀。
    suffix String 给提取的字段名添加后缀。
    mode String 字段的覆盖模式。默认为fill-auto。关于更多字段值及含义请参见字段提取检查与覆盖模式
  • 返回结果

    返回附带了新字段值的事件。

  • 函数示例
    • 示例1:默认格式。
      原始日志:
      data: "i=c1 k1=v1 k2=v2 k3=v3"
      加工规则:
      e_kv_delimit("data")
      加工结果:
      data: "i=c1 k1=v1 k2=v2 k3=v3"
      i: c1
      k2: v2
      k1: v1
      k3: v3
    • 示例2:&?格式。
      原始日志:
      data: "k1=v1&k2=v2?k3=v3"
      加工规则:
      e_kv_delimit("data",pair_sep=r"&?")
      加工结果:
      data: "k1=v1&k2=v2?k3=v3"
      k2: v2
      k1: v1
      k3: v3
    • 示例3:正则获取格式。
      原始日志:
      data: "k1=v1 k2:v2 k3=v3"
      加工规则:
      e_kv_delimit("data", kv_sep=r"(?:=|:)")
      加工结果:
      data: "k1=v1 k2:v2 k3=v3"
      k2: v2
      k1: v1
      k3: v3

e_syslogrfc

  • 函数格式
    e_syslogrfc(源字段名, rfc, fields_info=None, mode='overwrite')
  • 参数说明
    参数名称 参数类型 是否必填 说明
    源字段名 任意 字段名,需要填入代表priority值的字段。
    rfc String Syslog使用的RFC协议。可选SYSLOGRFC3164或者SYSLOGRFC5424
    fields_info Dict 需要进行重命名的字段,key表示旧名称,value表示新名称。以下是默认支持重命名的字段名及新名称,支持对新名称修改。{"_severity_":"sev","_facility_":"fac","_severitylabel_":"sevlabel","_facilitylabel_":"faclabel"}
    mode String 字段的覆盖模式。默认为overwrite。关于更多字段值及含义请参见字段提取检查与覆盖模式
  • 返回结果

    返回添加了字段信息的事件。

  • 函数示例
    • 示例1:默认格式。
      原始日志:
      receive_time: 1558663265
      _priority_: 13
      _version_: 1
      _log_time_: 2019-05-06 11:50:16.015554+08:00
      _hostname_: iZbp1a65x3r1vhpe94fi2qZ
      _program_: root
      _procid_: -
      _msgid_: -
      _extradata_: -
      _content_: twish
      加工规则:
      e_syslogrfc("_priority_","SYSLOGRFC5424")
      加工结果:
      receive_time: 1558663265
      _priority_: 13
      _version_: 1
      _log_time_: 2019-05-06 11:50:16.015554+08:00
      _hostname_: iZbp1a65x3r1vhpe94fi2qZ
      _program_: root
      _procid_: -
      _msgid_: -
      _extradata_: -
      _content_: twish
      _facility_: 1
      _severity_: 5
      _severitylabel_: Notice: normal but significant condition
      _facilitylabel_: user-level messages
    • 示例2:fields_info的使用。
      原始日志:
      receive_time: 1558663265
      _priority_: 13
      _version_: 1
      _log_time_: 2019-05-06 11:50:16.015554+08:00
      _hostname_: iZbp1a65x3r1vhpe94fi2qZ
      _program_: root
      _procid_: -
      _msgid_: -
      _extradata_: -
      _content_: twish
      加工规则:
      # 可以重命名添加字段
      e_syslogrfc("_priority_","SYSLOGRFC5424",{"_facility_": "fac", "_severity_": "sev", "_facilitylabel_": "_facility_label_", "_severitylabel_": "_severity_label_"})
      加工结果:
      receive_time: 1558663265
      _priority_: 13
      _version_: 1
      _log_time_: 2019-05-06 11:50:16.015554+08:00
      _hostname_: iZbp1a65x3r1vhpe94fi2qZ
      _program_: root
      _procid_: -
      _msgid_: -
      _extradata_: -
      _content_: twish
      _facility_: 1
      _severity_: 5
      _severity_label_: Notice: normal but significant condition
      _facility_label_: user-level messages