
# 流程控制函数
本文主要介绍流程控制函数的语法规则，包括参数解释、函数示例等。
#### 函数列表
| 函数                                                                                                                                      | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|
| [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. 示例1：字段值匹配后再进行操作。 result字段值为failed或failure时，设置__topic__字段的值为login_failed_event。
     - 测试数据
       ```
       {
        "result": "failed"
       }
       ```
       
     
     - 加工规则
       ```
       e_if(e_match("result", r"failed|failure"), e_set("__topic__", "login_failed_event"))
       ```
       
     
     - 加工结果
       ```
       result: failed
       __topic__: login_failed_event
       ```
       
      
  
  2. 示例2：根据字段值判断后再提取数据。 当request_body字段存在且值非空时，调用字段类操作函数JSON将request_body字段展开成多个值。
     - 测试数据
       ```
       {
         "request_body": {
           "k1": 100,
           "k2": 200
         }
       }
       ```
       
     
     - 加工规则
       ```
       e_if(v("request_body"), e_json("request_body"))
       ```
       
     
     - 加工结果
       ```
       request_body: {"k1": 100, "k2": 200}
       k1: 100
       k2: 200
       ```
       
      
  
  3. 示例3：高级判断后再进行操作。 当valid字段的值为小写failed时，丢弃日志。
     - 测试数据
       ```
       {
        "valid":"failed"
       }
       ```
       
     
     - 加工规则
       ```
       e_if(op_eq(str_lower(v("valid")), "failed"),  e_drop())
       ```
       
     
     - 加工结果：丢弃日志
      
  
  4. 示例4：多个条件按顺序操作。
     - 测试数据
       ```
       {
        "valid":"failed"
       }
       ```
       
     
     - 加工规则
       ```
       e_if(True, e_set("__topic__", "default_login"),   e_match("valid", "failed"), e_set("__topic__", "login_failed_event"))
       ```
       
     
     - 加工结果
       ```
       valid: failed
       __topic__:login_failed_event
       ```
       
      
   
- **更多参考**
  支持和其他函数组合使用。
  
 
 #### e_if_else
根据判断条件的结果执行操作。
- **函数格式**
  ```
  e_if_else(条件, 真时操作, 假时操作)
  ```
  
- **参数说明**
  
  | **参数名称** | **参数类型** | **是否必填** |           **说明**           |
  |---|---|---|---|
  | 条件       | 任意       | 是        | 表达式或其组合。其结果不是布尔值时，会进行真假判断。 |
  | 真时操作     | 全局操作函数   | 是        | 全局操作函数或其组合。                |
  | 假时操作     | 全局操作函数   | 是        | 全局操作函数或其组合。                |
     
  
- **返回结果**
  返回不同条件对应的操作结果。
  
- **函数示例**
  如果result字段的值为ok或pass，或者status字段的值为200，则保留日志。
  - 测试数据 测试数据1：
    ```
    {
    "result":"ok",
    "status": 400
    }
    ```
    测试数据2：
    ```
    {
    "result": "Pass",
    "status": 200
    }
    ```
    测试数据3：
    ```
    {
    "result": "failure",
    "status": 500
    }
    ```
    
  
  - 加工规则
    ```
    e_if_else(
        op_or(e_match("result", r"(?i)ok|pass"), e_search("status== 200")), e_keep(),e_drop() 
    )
    ```
    
  
  - 加工结果
    ```
    result: ok 
    status: 400
    ```
    ```
    result: Pass 
    status: 200
    ```
    
   
 
 #### e_switch
组合多个条件和操作。
- **函数格式**
  ```
  e_switch(条件1, 操作1, ……, default=None)
  ```
  **说明** 函数中条件和操作必须成对出现。
  
- **参数说明**
  
  | **参数名称** | **参数类型** | **是否必填** |           **说明**            |
  |---|---|---|---|
  | 条件       | 任意       | 是        | 表达式或其组合。其结果不是布尔值时，会进行真假判断。  |
  | 操作       | 全局操作函数   | 是        | 全局操作函数或其组合。                 |
  | default  | 全局操作函数   | 否        | 默认的全局操作函数或其组合。没有条件满足时执行该操作。 |
     
  
- **返回结果**
  返回加工处理后的日志。
  
- **函数示例**
  1. 如果content字段的值为123，则将__topic__字段的值设置为Number。如果data字段的值为123，则将__topic__字段的值设置为PRO。
     - 测试数据 测试数据1：
       ```
       {
       "__topic__": ,  
       "age": 18,
       "content": 123,
       "name":"maki", 
       "data": 342
       }
       ```
       测试数据2：
       ```
       {
       "__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
       ```
       
      
  
  2. 通过e_switch语法和e_output语法结合，将符合规则的日志投递到不同的Logstream。其中default=e_drop()，表示将不满足规则的日志丢弃，不做投递处理。若不设置default参数，则表示不满足规则日志都会被投递到配置的第一个Logstream中。 output的加工结果不会显示到加工结果框中。
     - 测试数据
       ```
       {
       "__topic__": "sas-log-dns" ,
       "test": "aa" , 
       "__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())
       ```
       
      
   
- **更多参考**
  支持和其他函数组合使用。
  
 
