本文主要介绍流程控制函数的语法规则,包括参数解释、函数示例等。

函数列表

函数 说明
e_compose 用于组合一系列操作。
  • 常用于e_if、e_switch、e_if_else中组合操作。
  • 依次调用操作,将日志传递转换并返回最后的日志。
  • 对于某一条日志,如果其中某一操作删除了日志,则不会再执行后续操作。
e_if 条件与操作组合。
  • 满足条件则进行对应操作,不满足条件则不进行对应操作,直接进行下一个条件判断。
  • 对于某一条日志,如果其中某一操作删除了日志,则不会再执行后续操作。
e_if(
    e_has("a"), e_output("target-a"), 
    e_has("b"), e_output("target-b"),
)
例如,该加工规则相当于以下Python代码结构:
if e_has("a"):
    e_output("target-a")
if e_has("b"):
    e_output("target-b")
e_if_else 根据条件判断的结果进行对应操作。
e_if_else(e_has("a"), e_output("target-a"), e_output("target-b"))
例如,该加工规则相当于以下Python代码结构:
if e_has("a"):
    e_output("target-a")
else:
    e_output("target-b")
e_switch 条件与操作的组合。
  • 满足条件则进行对应操作并返回结果,不满足条件则不进行对应操作,直接进行下一个条件判断。
  • 如果没有满足任何条件,但配置了默认参数,则执行默认配置的操作并返回结果。
  • 对于某一条日志,如果其中某一操作删除了日志,则不会再执行后续操作。
e_switch(
    e_has("a"), e_output("target-a"), 
    e_has("b"), e_output("target-b"),
    default=e_output("target-default"),
)
例如,该加工规则相当于以下Python代码结构:
if e_has("a"):
    e_output("target-a")
elif e_has("b"):
    e_output("target-b")
else:
    e_output("target-default")

e_compose

组合多个操作。
  • 函数格式
    e_compose(操作1, 操作2, ……)     
  • 参数说明
    参数 参数类型 是否必填 说明
    操作1 全局操作函数 全局操作函数或其组合。
    操作2 全局操作函数 全局操作函数或其组合。
  • 返回结果

    返回操作后日志。

  • 函数示例

    如果content字段的值为123,则先删除age字段和name字段,然后将content字段的值设置为ctx

    • 原始日志
      content: 123
      age: 23
      name: twiss
    • 加工规则
      e_if(
          e_search("content==123"),
          e_compose(e_drop_fields("age|name"), e_rename("content", "ctx")),
      )
    • 加工结果
      ctx: 123

e_if

根据判断条件执行操作。
  • 函数格式
    e_if(条件, 操作)
    e_if(条件1, 操作1, 条件2, 操作2, ……)
    说明 函数中条件操作必须成对出现。
  • 参数说明
    参数 参数类型 是否必填 说明
    条件 任意 表达式或其组合。其结果不是布尔值时,会进行真假判断。
    操作 全局操作函数 全局操作函数或其组合。
  • 返回结果

    返回加工处理后的日志。

  • 函数示例
    • 示例1:字段值匹配后再进行操作。
      result字段值为failedfailure时,设置__topic__字段的值为login_failed_event
      e_if(e_match("result", r"failed|failure"), e_set("__topic__", "login_failed_event"))
    • 示例2:根据字段值判断后再提取数据。
      request_body字段存在且值非空时,调用字段类操作函数JSON将request_body字段展开成多个值。
      e_if(v("request_body"), e_json("request_body"))
    • 示例3:高级判断后再进行操作。
      valid字段的值为小写failed时,丢弃日志。
      e_if(op_eq(str_lower(v("valid")), "failed"), DROP)
    • 示例4:多个条件按顺序操作。
      e_if(True, e_set("__topic__", "default_login"), 
           e_match("valid", "failed"), e_set("__topic__", "login_failed_event")
        )

e_if_else

根据判断条件的结果执行操作。
  • 函数格式
    e_if_else(条件, 真时操作, 假时操作)
  • 参数说明
    参数 参数类型 是否必填 说明
    条件 任意 表达式或其组合。其结果不是布尔值时,会进行真假判断。
    真时操作 全局操作函数 全局操作函数或其组合。
    假时操作 全局操作函数 全局操作函数或其组合。
  • 返回结果

    返回不同条件对应的操作结果。

  • 函数示例

    如果result字段的值为okpass,或者status字段的值为200,则保留日志。

    • 原始日志
      result: ok
      status: 400
      result: Pass
      status: 200
      result: failure
      status: 500
    • 加工规则
      e_if_else(
          op_or(e_match("result", r"(?i)ok|pass"), e_search("status== 200")), KEEP, DROP
      )
    • 加工结果:只保留第一条和第二条日志,第三条日志被删除。
      result: ok
      status: 400
      result: Pass
      status: 200

e_switch

组合多个条件和操作。
  • 函数格式
    e_switch(条件1, 操作1, ……, default=None)
    说明 函数中条件操作必须成对出现。
  • 参数说明
    参数 参数类型 是否必填 说明
    条件 任意 表达式或其组合。其结果不是布尔值时,会进行真假判断。
    操作 全局操作函数 全局操作函数或其组合。
    default 全局操作函数 默认的全局操作函数或其组合。没有条件满足时执行该操作。
  • 返回结果

    返回加工处理后的日志。

  • 函数示例
    • 如果content字段的值为123,则将__topic__字段的值设置为Number。如果data字段的值为123,则将__topic__字段的值设置为PRO
      • 原始日志
        __topic__:  
        age: 18
        content: 123
        name: maki
        data: 342
        __topic__:  
        age: 18
        content: 23
        name: maki
        data: 123
      • 加工规则
        e_switch(
            e_search("content==123"),
            e_set("__topic__", "Number", mode="overwrite"),
            e_search("data==123"),
            e_set("__topic__", "PRO", mode="overwrite"),
        )
      • 加工结果
        __topic__: Number
        age: 18
        content: 123
        name: maki
        data: 342
        __topic__: PRO
        age: 18
        content: 23
        name: maki
        data: 123
    • 通过e_switch语法和e_output语法结合,将符合规则的日志投递到不同的Logstore。其中default=e_drop(),表示将不满足规则的日志丢弃,不做投递处理。若不设置default参数,则表示满足规则日志都会被投递到配置的第一个Logstore中。
      • 原始日志
        __topic__: sas-log-dns
        test: aliyun
        
        __topic__: aegis-log-network
        test:ecs
        
        __topic__: local-dns
        test:sls
        
        __topic__: aegis-log-login
        test: sls
      • 加工规则
        e_switch(e_match("__topic__","sas-log-dns"),e_output(name="target1"),
        e_match("__topic__","sas-log-process"),e_output(name="target2"),
        e_match("__topic__","local-dns"),e_output(name="target3"),
        e_match("__topic__","aegis-log-network"),e_output(name="target4"),
        e_match("__topic__","aegis-log-login"),e_output(name="target5"),
        default=e_drop())