This is an automated email from the ASF dual-hosted git repository.

monkeydluffy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix.git


The following commit(s) were added to refs/heads/master by this push:
     new 2f6fd5012 feat: Add schema attribute definition for some log plug-ins 
(#10738)
2f6fd5012 is described below

commit 2f6fd50121c545742a902cf838287406d103566a
Author: baiyun <337531...@qq.com>
AuthorDate: Wed Jan 3 09:51:46 2024 +0800

    feat: Add schema attribute definition for some log plug-ins (#10738)
---
 apisix/plugins/file-logger.lua              |   8 ++
 apisix/plugins/http-logger.lua              |   7 ++
 apisix/plugins/loggly.lua                   |   7 ++
 apisix/plugins/tencent-cloud-cls.lua        |  14 +++
 docs/en/latest/plugins/file-logger.md       |   2 +
 docs/en/latest/plugins/http-logger.md       |   1 +
 docs/en/latest/plugins/loggly.md            |  21 ++--
 docs/en/latest/plugins/tencent-cloud-cls.md |   6 +-
 docs/zh/latest/plugins/file-logger.md       |  12 ++-
 docs/zh/latest/plugins/http-logger.md       |  23 ++---
 t/plugin/file-logger2.t                     | 148 ++++++++++++++++++++++++++++
 t/plugin/http-logger-json.t                 |  54 ++++++++++
 t/plugin/loggly.t                           | 118 ++++++++++++++++++++--
 t/plugin/tencent-cloud-cls.t                | 133 +++++++++++++++++++++++++
 14 files changed, 519 insertions(+), 35 deletions(-)

diff --git a/apisix/plugins/file-logger.lua b/apisix/plugins/file-logger.lua
index 298fae2e4..e0970d821 100644
--- a/apisix/plugins/file-logger.lua
+++ b/apisix/plugins/file-logger.lua
@@ -32,6 +32,14 @@ local schema = {
             type = "string"
         },
         log_format = {type = "object"},
+        include_req_body = {type = "boolean", default = false},
+        include_req_body_expr = {
+            type = "array",
+            minItems = 1,
+            items = {
+                type = "array"
+            }
+        },
         include_resp_body = {type = "boolean", default = false},
         include_resp_body_expr = {
             type = "array",
diff --git a/apisix/plugins/http-logger.lua b/apisix/plugins/http-logger.lua
index c417e29f8..9da5373d3 100644
--- a/apisix/plugins/http-logger.lua
+++ b/apisix/plugins/http-logger.lua
@@ -35,6 +35,13 @@ local schema = {
         timeout = {type = "integer", minimum = 1, default = 3},
         log_format = {type = "object"},
         include_req_body = {type = "boolean", default = false},
+        include_req_body_expr = {
+            type = "array",
+            minItems = 1,
+            items = {
+                type = "array"
+            }
+        },
         include_resp_body = {type = "boolean", default = false},
         include_resp_body_expr = {
             type = "array",
diff --git a/apisix/plugins/loggly.lua b/apisix/plugins/loggly.lua
index 92fafb782..16dc9b4a6 100644
--- a/apisix/plugins/loggly.lua
+++ b/apisix/plugins/loggly.lua
@@ -62,6 +62,13 @@ local schema = {
             description = "base severity log level",
         },
         include_req_body = {type = "boolean", default = false},
+        include_req_body_expr = {
+            type = "array",
+            minItems = 1,
+            items = {
+                type = "array"
+            }
+        },
         include_resp_body = {type = "boolean", default = false},
         include_resp_body_expr = {
             type = "array",
diff --git a/apisix/plugins/tencent-cloud-cls.lua 
b/apisix/plugins/tencent-cloud-cls.lua
index 7a4b7783f..38fe56503 100644
--- a/apisix/plugins/tencent-cloud-cls.lua
+++ b/apisix/plugins/tencent-cloud-cls.lua
@@ -39,7 +39,21 @@ local schema = {
             default = 1
         },
         include_req_body = { type = "boolean", default = false },
+        include_req_body_expr = {
+            type = "array",
+            minItems = 1,
+            items = {
+                type = "array"
+            }
+        },
         include_resp_body = { type = "boolean", default = false },
+        include_resp_body_expr = {
+            type = "array",
+            minItems = 1,
+            items = {
+                type = "array"
+            }
+        },
         global_tag = { type = "object" },
         log_format = {type = "object"},
     },
diff --git a/docs/en/latest/plugins/file-logger.md 
b/docs/en/latest/plugins/file-logger.md
index 5b2974e13..f46b5a68c 100644
--- a/docs/en/latest/plugins/file-logger.md
+++ b/docs/en/latest/plugins/file-logger.md
@@ -47,6 +47,8 @@ The `file-logger` Plugin is used to push log streams to a 
specific location.
 | ---- | ------ | -------- | ------------- |
 | path | string | True     | Log file path. |
 | log_format | object | False    | Log format declared as key value pairs in 
JSON format. Values only support strings. [APISIX](../apisix-variable.md) or 
[Nginx](http://nginx.org/en/docs/varindex.html) variables can be used by 
prefixing the string with `$`. |
+| include_req_body       | boolean | False    | When set to `true` includes 
the request body in the log. If the request body is too big to be kept in the 
memory, it can't be logged due to Nginx's limitations. |
+| include_req_body_expr  | array   | False    | Filter for when the 
`include_req_body` attribute is set to `true`. Request body is only logged when 
the expression set here evaluates to `true`. See 
[lua-resty-expr](https://github.com/api7/lua-resty-expr) for more. |
 | include_resp_body      | boolean | False     | When set to `true` includes 
the response body in the log file.                                              
                                                                                
                                  |
 | include_resp_body_expr | array   | False     | When the `include_resp_body` 
attribute is set to `true`, use this to filter based on 
[lua-resty-expr](https://github.com/api7/lua-resty-expr). If present, only logs 
the response into file if the expression evaluates to `true`. |
 | match        | array[] | False   | Logs will be recorded when the rule 
matching is successful if the option is set. See 
[lua-resty-expr](https://github.com/api7/lua-resty-expr#operator-list) for a 
list of available expressions.   |
diff --git a/docs/en/latest/plugins/http-logger.md 
b/docs/en/latest/plugins/http-logger.md
index f75869f8b..aef965f0a 100644
--- a/docs/en/latest/plugins/http-logger.md
+++ b/docs/en/latest/plugins/http-logger.md
@@ -42,6 +42,7 @@ This will allow the ability to send log data requests as JSON 
objects to monitor
 | timeout                | integer | False    | 3             | [1,...]        
      | Time to keep the connection alive for after sending a request.          
                                                                                
                                                                 |
 | log_format | object | False    |     |               | Log format declared 
as key value pairs in JSON format. Values only support strings. 
[APISIX](../apisix-variable.md) or 
[Nginx](http://nginx.org/en/docs/varindex.html) variables can be used by 
prefixing the string with `$`. |
 | include_req_body       | boolean | False    | false         | [false, true]  
      | When set to `true` includes the request body in the log. If the request 
body is too big to be kept in the memory, it can't be logged due to Nginx's 
limitations.                                                         |
+| include_req_body_expr  | array   | False    |               |                
      | Filter for when the `include_req_body` attribute is set to `true`. 
Request body is only logged when the expression set here evaluates to `true`. 
See [lua-resty-expr](https://github.com/api7/lua-resty-expr) for more. |
 | include_resp_body      | boolean | False    | false         | [false, true]  
      | When set to `true` includes the response body in the log.               
                                                                                
                                                                 |
 | include_resp_body_expr | array   | False    |               |                
      | When the `include_resp_body` attribute is set to `true`, use this to 
filter based on [lua-resty-expr](https://github.com/api7/lua-resty-expr). If 
present, only logs the response if the expression evaluates to `true`. |
 | concat_method          | string  | False    | "json"        | ["json", 
"new_line"] | Sets how to concatenate logs. When set to `json`, uses 
`json.encode` for all pending logs and when set to `new_line`, also uses 
`json.encode` but uses the newline (`\n`) to concatenate lines.                 
         |
diff --git a/docs/en/latest/plugins/loggly.md b/docs/en/latest/plugins/loggly.md
index cee32c8fc..663ba0574 100644
--- a/docs/en/latest/plugins/loggly.md
+++ b/docs/en/latest/plugins/loggly.md
@@ -37,16 +37,17 @@ When the maximum batch size is exceeded, the data in the 
queue is pushed to Logg
 
 ## Attributes
 
-| Name                   | Type          | Required | Default | Description    
                                                                                
                                                                                
                                          |
-|------------------------|---------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| customer_token         | string        | True     |         | Unique 
identifier used when sending logs to Loggly to ensure that they are sent to the 
right organisation account.                                                     
                                                  |
-| severity               | string (enum) | False    | INFO    | Syslog log 
event severity level. Choose between: `DEBUG`, `INFO`, `NOTICE`, `WARNING`, 
`ERR`, `CRIT`, `ALERT`, and `EMEGR`.                                            
                                                   |
-| severity_map           | object        | False    | nil     | A way to map 
upstream HTTP response codes to Syslog severity. Key-value pairs where keys are 
the HTTP response codes and the values are the Syslog severity levels. For 
example `{"410": "CRIT"}`.                       |
-| tags                   | array         | False    |         | Metadata to be 
included with any event log to aid in segmentation and filtering.               
                                                                                
                                          |
-| log_format       | object  | False    | {"host": "$host", "@timestamp": 
"$time_iso8601", "client_ip": "$remote_addr"} | Log format declared as key 
value pairs in JSON format. Values only support strings. 
[APISIX](../apisix-variable.md) or 
[Nginx](http://nginx.org/en/docs/varindex.html) variables can be used by 
prefixing the string with `$`. |
-| include_req_body       | boolean       | False    | false   | When set to 
`true` includes the request body in the log. If the request body is too big to 
be kept in the memory, it can't be logged due to Nginx's limitations.           
                                              |
-| include_resp_body      | boolean       | False    | false   | When set to 
`true` includes the response body in the log.                                   
                                                                                
                                              |
-| include_resp_body_expr | array         | False    |         | When the 
`include_resp_body` attribute is set to `true`, use this to filter based on 
[lua-resty-expr](https://github.com/api7/lua-resty-expr). If present, only logs 
the response if the expression evaluates to `true`. |
+| Name                   | Type          | Required | Default | Description    
                                                                                
                                                                                
                                                |
+|------------------------|---------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| customer_token         | string        | True     |         | Unique 
identifier used when sending logs to Loggly to ensure that they are sent to the 
right organisation account.                                                     
                                                        |
+| severity               | string (enum) | False    | INFO    | Syslog log 
event severity level. Choose between: `DEBUG`, `INFO`, `NOTICE`, `WARNING`, 
`ERR`, `CRIT`, `ALERT`, and `EMEGR`.                                            
                                                        |
+| severity_map           | object        | False    | nil     | A way to map 
upstream HTTP response codes to Syslog severity. Key-value pairs where keys are 
the HTTP response codes and the values are the Syslog severity levels. For 
example `{"410": "CRIT"}`.                             |
+| tags                   | array         | False    |         | Metadata to be 
included with any event log to aid in segmentation and filtering.               
                                                                                
                                                |
+| log_format             | object        | False    | {"host": "$host", 
"@timestamp": "$time_iso8601", "client_ip": "$remote_addr"} | Log format 
declared as key value pairs in JSON format. Values only support strings. 
[APISIX](../apisix-variable.md) or 
[Nginx](http://nginx.org/en/docs/varindex.html) variables can be used by 
prefixing the string with `$`. |
+| include_req_body       | boolean       | False    | false   | When set to 
`true` includes the request body in the log. If the request body is too big to 
be kept in the memory, it can't be logged due to Nginx's limitations.           
                                                    |
+| include_req_body_expr  | array         | False    |         | Filter for 
when the `include_req_body` attribute is set to `true`. Request body is only 
logged when the expression set here evaluates to `true`. See 
[lua-resty-expr](https://github.com/api7/lua-resty-expr) for more.        |
+| include_resp_body      | boolean       | False    | false   | When set to 
`true` includes the response body in the log.                                   
                                                                                
                                                   |
+| include_resp_body_expr | array         | False    |         | When the 
`include_resp_body` attribute is set to `true`, use this to filter based on 
[lua-resty-expr](https://github.com/api7/lua-resty-expr). If present, only logs 
the response if the expression evaluates to `true`.       |
 
 This Plugin supports using batch processors to aggregate and process entries 
(logs/data) in a batch. This avoids the need for frequently submitting the 
data. The batch processor submits data every `5` seconds or when the data in 
the queue reaches `1000`. See [Batch 
Processor](../batch-processor.md#configuration) for more information or setting 
your custom configuration.
 
diff --git a/docs/en/latest/plugins/tencent-cloud-cls.md 
b/docs/en/latest/plugins/tencent-cloud-cls.md
index a061251f9..559f13e2d 100644
--- a/docs/en/latest/plugins/tencent-cloud-cls.md
+++ b/docs/en/latest/plugins/tencent-cloud-cls.md
@@ -35,16 +35,18 @@ The `tencent-cloud-cls` Plugin uses [TencentCloud 
CLS](https://cloud.tencent.com
 ## Attributes
 
 | Name              | Type    | Required | Default | Valid values  | 
Description                                                                     
                                                                                
 |
-| ----------------- | ------- | -------- |---------| ------------- 
|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| ----------------- | ------- 
|----------|---------|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------|
 | cls_host          | string  | Yes      |         |               | CLS API 
host,please refer [Uploading Structured 
Logs](https://www.tencentcloud.com/document/api/614/16873).                     
                                 |
 | cls_topic         | string  | Yes      |         |               | topic id 
of CLS.                                                                         
                                                                        |
 | secret_id         | string  | Yes      |         |               | SecretId 
of your API key.                                                                
                                                                        |
 | secret_key        | string  | Yes      |         |               | SecretKey 
of your API key.                                                                
                                                                       |
 | sample_ratio      | number  | No       | 1       | [0.00001, 1]  | How often 
to sample the requests. Setting to `1` will sample all requests.                
                                                                       |
 | include_req_body  | boolean | No       | false   | [false, true] | When set 
to `true` includes the request body in the log. If the request body is too big 
to be kept in the memory, it can't be logged due to NGINX's limitations. |
+| include_req_body_expr  | array   | No       |         |               | 
Filter for when the `include_req_body` attribute is set to `true`. Request body 
is only logged when the expression set here evaluates to `true`. See 
[lua-resty-expr](https://github.com/api7/lua-resty-expr) for more.              
                                                                                
                            |
 | include_resp_body | boolean | No       | false   | [false, true] | When set 
to `true` includes the response body in the log.                                
                                                                        |
+| include_resp_body_expr | array   | No  |         |               | Filter 
for when the `include_resp_body` attribute is set to `true`. Response body is 
only logged when the expression set here evaluates to `true`. See 
[lua-resty-expr](https://github.com/api7/lua-resty-expr) for more.              
                                                                                
                          |
 | global_tag        | object  | No       |         |               | kv pairs 
in JSON,send with each log.                                                     
                                                                        |
-| log_format       | object  | No    |  |              | Log format declared 
as key value pairs in JSON format. Values only support strings. 
[APISIX](../apisix-variable.md) or 
[Nginx](http://nginx.org/en/docs/varindex.html) variables can be used by 
prefixing the string with `$`. |
+| log_format       | object  | No       |         |               | Log format 
declared as key value pairs in JSON format. Values only support strings. 
[APISIX](../apisix-variable.md) or 
[Nginx](http://nginx.org/en/docs/varindex.html) variables can be used by 
prefixing the string with `$`. |
 
 NOTE: `encrypt_fields = {"secret_key"}` is also defined in the schema, which 
means that the field will be stored encrypted in etcd. See [encrypted storage 
fields](../plugin-develop.md#encrypted-storage-fields).
 
diff --git a/docs/zh/latest/plugins/file-logger.md 
b/docs/zh/latest/plugins/file-logger.md
index 81b7e6223..ddb9b646b 100644
--- a/docs/zh/latest/plugins/file-logger.md
+++ b/docs/zh/latest/plugins/file-logger.md
@@ -46,11 +46,13 @@ description: API 网关 Apache APISIX file-logger 插件可用于将日志数据
 ## 属性
 
 | 名称             | 类型     | 必选项 | 描述                                           
  |
-| ---------------- | ------- | ------ | 
------------------------------------------------ |
-| path             | string  | 是     | 自定义输出文件路径。例如:`logs/file.log`。        |
-| log_format       | object  | 否     | 以 JSON 格式的键值对来声明日志格式。对于值部分,仅支持字符串。如果是以 
`$` 开头,则表明是要获取 [APISIX 变量](../apisix-variable.md) 或 [NGINX 
内置变量](http://nginx.org/en/docs/varindex.html)。 |
-| include_resp_body      | boolean | 否     | 当设置为 `true` 时,生成的文件包含响应体。         
                                                                                
      |
-| include_resp_body_expr | array   | 否     | 当 `include_resp_body` 属性设置为 
`true` 时,使用该属性并基于 [lua-resty-expr](https://github.com/api7/lua-resty-expr) 
进行过滤。如果存在,则仅在表达式计算结果为 `true` 时记录响应。       |
+| ---------------- | ------- |-----| 
------------------------------------------------ |
+| path             | string  | 是   | 自定义输出文件路径。例如:`logs/file.log`。        |
+| log_format       | object  | 否   | 以 JSON 格式的键值对来声明日志格式。对于值部分,仅支持字符串。如果是以 
`$` 开头,则表明是要获取 [APISIX 变量](../apisix-variable.md) 或 [NGINX 
内置变量](http://nginx.org/en/docs/varindex.html)。 |
+| include_req_body   | boolean | 否   | 当设置为 `true` 
时,日志中将包含请求体。如果请求体太大而无法在内存中保存,则由于 Nginx 的限制,无法记录请求体。|
+| include_req_body_expr | array   | 否   | 当 `include_req_body` 属性设置为 `true` 
时的过滤器。只有当此处设置的表达式求值为 `true` 时,才会记录请求体。有关更多信息,请参阅 
[lua-resty-expr](https://github.com/api7/lua-resty-expr) 。 |
+| include_resp_body      | boolean | 否   | 当设置为 `true` 时,生成的文件包含响应体。           
                                                                                
    |
+| include_resp_body_expr | array   | 否   | 当 `include_resp_body` 属性设置为 `true` 
时,使用该属性并基于 [lua-resty-expr](https://github.com/api7/lua-resty-expr) 
进行过滤。如果存在,则仅在表达式计算结果为 `true` 时记录响应。       |
 | match        | array[] | 否   |  当设置了这个选项后,只有匹配规则的日志才会被记录。`match` 
是一个表达式列表,具体请参考 
[lua-resty-expr](https://github.com/api7/lua-resty-expr#operator-list)。   |
 
 ## 插件元数据设置
diff --git a/docs/zh/latest/plugins/http-logger.md 
b/docs/zh/latest/plugins/http-logger.md
index 208ca3c38..06fc12030 100644
--- a/docs/zh/latest/plugins/http-logger.md
+++ b/docs/zh/latest/plugins/http-logger.md
@@ -35,17 +35,18 @@ description: 本文介绍了 API 网关 Apache APISIX 的 http-logger 插件。
 
 ## 属性
 
-| 名称                   | 类型     | 必选项 | 默认值         | 有效值               | 描述   
                                          |
-| ---------------------- | ------- | ------ | ------------- | 
-------------------- | ------------------------------------------------ |
-| uri                    | string  | 是     |               |                   
   | HTTP 或 HTTPS 服务器的 URI。                   |
-| auth_header            | string  | 否     |               |                   
   | 授权 header(如果需要)。                                    |
-| timeout                | integer | 否     | 3             | [1,...]           
   | 发送请求后保持连接处于活动状态的时间。           |
-| log_format             | object  | 否     |               |         | 以 JSON 
格式的键值对来声明日志格式。对于值部分,仅支持字符串。如果是以 `$` 开头,则表明是要获取 [APISIX 
变量](../apisix-variable.md) 或 [NGINX 
内置变量](http://nginx.org/en/docs/varindex.html)。 |
-| include_req_body       | boolean | 否     | false         | [false, true]     
   | 当设置为 `true` 时,将请求体包含在日志中。如果请求体太大而无法保存在内存中,由于 NGINX 的限制,无法记录。 |
-| include_resp_body      | boolean | 否     | false         | [false, true]     
   | 当设置为 `true` 时,包含响应体。                                                       
                                        |
-| include_resp_body_expr | array   | 否     |               |                   
   | 当 `include_resp_body` 属性设置为 `true` 时,使用该属性并基于 
[lua-resty-expr](https://github.com/api7/lua-resty-expr) 进行过滤。如果存在,则仅在表达式计算结果为 
`true` 时记录响应。       |
-| concat_method          | string  | 否     | "json"        | ["json", 
"new_line"] | 枚举类型: **json**:对所有待发日志使用 `json.encode` 
编码。**new_line**:对每一条待发日志单独使用 `json.encode` 编码并使用 `\n` 连接起来。 |
-| ssl_verify             | boolean | 否     | false          | [false, true]    
   | 当设置为 `true` 时验证证书。 |
+| 名称                      | 类型     | 必选项 | 默认值         | 有效值               | 
描述                                             |
+|-------------------------| ------- |-----| ------------- | 
-------------------- | ------------------------------------------------ |
+| uri                     | string  | 是   |               |                    
  | HTTP 或 HTTPS 服务器的 URI。                   |
+| auth_header             | string  | 否   |               |                    
  | 授权 header(如果需要)。                                    |
+| timeout                 | integer | 否   | 3             | [1,...]            
  | 发送请求后保持连接处于活动状态的时间。           |
+| log_format              | object  | 否   |               |         | 以 JSON 
格式的键值对来声明日志格式。对于值部分,仅支持字符串。如果是以 `$` 开头,则表明是要获取 [APISIX 
变量](../apisix-variable.md) 或 [NGINX 
内置变量](http://nginx.org/en/docs/varindex.html)。 |
+| include_req_body        | boolean | 否   | false         | [false, true]      
  | 当设置为 `true` 时,将请求体包含在日志中。如果请求体太大而无法保存在内存中,由于 NGINX 的限制,无法记录。 |
+| include_req_body_expr   | array   | 否   |               |                    
  | 当 `include_req_body` 属性设置为 `true` 时的过滤器。只有当此处设置的表达式求值为 `true` 
时,才会记录请求体。有关更多信息,请参阅 [lua-resty-expr](https://github.com/api7/lua-resty-expr) 。 
|
+| include_resp_body       | boolean | 否   | false         | [false, true]      
  | 当设置为 `true` 时,包含响应体。                                                        
                                       |
+| include_resp_body_expr  | array   | 否   |               |                    
  | 当 `include_resp_body` 属性设置为 `true` 时,使用该属性并基于 
[lua-resty-expr](https://github.com/api7/lua-resty-expr) 进行过滤。如果存在,则仅在表达式计算结果为 
`true` 时记录响应。       |
+| concat_method           | string  | 否   | "json"        | ["json", 
"new_line"] | 枚举类型: **json**:对所有待发日志使用 `json.encode` 
编码。**new_line**:对每一条待发日志单独使用 `json.encode` 编码并使用 `\n` 连接起来。 |
+| ssl_verify              | boolean | 否   | false          | [false, true]     
  | 当设置为 `true` 时验证证书。 |
 
 该插件支持使用批处理器来聚合并批量处理条目(日志和数据)。这样可以避免该插件频繁地提交数据。默认情况下每 `5` 秒钟或队列中的数据达到 `1000` 
条时,批处理器会自动提交数据,如需了解更多信息或自定义配置,请参考 [Batch Processor](../batch-processor.md#配置)。
 
diff --git a/t/plugin/file-logger2.t b/t/plugin/file-logger2.t
index 5cf3a76cc..706f401fe 100644
--- a/t/plugin/file-logger2.t
+++ b/t/plugin/file-logger2.t
@@ -366,3 +366,151 @@ write file log success
     }
 --- response_body
 not write file log
+
+
+
+=== TEST 11: add plugin with 'include_req_body' setting
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            t('/apisix/admin/plugin_metadata/file-logger', ngx.HTTP_DELETE)
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{
+                        "plugins": {
+                            "file-logger": {
+                                "path": "file-with-req-body.log",
+                                "include_req_body": true
+                            }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1982": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/hello"
+                }]]
+                )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+        }
+    }
+
+
+
+=== TEST 12: verify plugin for file-logger with request
+--- config
+    location /t {
+        content_by_lua_block {
+            local core = require("apisix.core")
+            local t = require("lib.test_admin").test
+            local code = t("/hello", ngx.HTTP_POST, "body-data")
+            local fd, err = io.open("file-with-req-body.log", 'r')
+            local msg
+
+            if not fd then
+                core.log.error("failed to open file: file-with-req-body.log, 
error info: ", err)
+                return
+            end
+
+            -- note only for first line
+            msg = fd:read()
+
+            local new_msg = core.json.decode(msg)
+            ngx.status = code
+            if new_msg.request ~= nil and new_msg.request.body == "body-data" 
then
+                ngx.status = code
+                ngx.say('contain with target')
+            end
+        }
+    }
+--- response_body
+contain with target
+
+
+
+=== TEST 13: check file-logger 'include_req_body' with 'expr'
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{
+                        "plugins": {
+                            "file-logger": {
+                                "path": "file-with-req-expr-body.log",
+                                "include_req_body": true,
+                                "include_req_body_expr": [
+                                    [
+                                      "arg_log_body",
+                                      "==",
+                                      "yes"
+                                    ]
+                                ]
+                            }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1982": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/hello"
+                }]]
+                )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+        }
+    }
+
+
+
+=== TEST 14: verify file-logger req with expression of concern
+--- config
+    location /t {
+        content_by_lua_block {
+            local core = require("apisix.core")
+            local t = require("lib.test_admin").test
+            local code = t("/hello?log_body=yes",
+                ngx.HTTP_POST,
+                [[{"foo": "bar"}]]
+                )
+            local fd, err = io.open("file-with-req-expr-body.log", 'r')
+            local msg
+
+            if not fd then
+                core.log.error("failed to open file: 
file-with-req-expr-body.log, error info: ", err)
+                return
+            end
+
+            -- note only for first line
+            msg = fd:read()
+
+            local new_msg = core.json.decode(msg)
+            ngx.status = code
+            if new_msg.request ~= nil and new_msg.request.body ~= nil then
+                ngx.status = code
+                ngx.say('contain target body hits with expr')
+            end
+
+            --- a new request is logged
+            t("/hello?log_body=no", ngx.HTTP_POST, [[{"foo": "b"}]])
+            msg = fd:read("*l")
+            local new_msg = core.json.decode(msg)
+            if new_msg.request.body == nil then
+                ngx.say('skip unconcern body')
+            end
+        }
+    }
+--- response_body
+contain target body hits with expr
+skip unconcern body
diff --git a/t/plugin/http-logger-json.t b/t/plugin/http-logger-json.t
index 1642ce6d1..b4a46af55 100644
--- a/t/plugin/http-logger-json.t
+++ b/t/plugin/http-logger-json.t
@@ -183,3 +183,57 @@ POST /hello
 {"sample_payload":"hello"}
 --- error_log eval
 qr/(.*"response":\{.*"body":"hello 
world\\n".*|.*\{\\\"sample_payload\\\":\\\"hello\\\"\}.*){0}/
+
+
+
+=== TEST 7: json body with request_body and request_body expression
+--- apisix_yaml
+routes:
+  -
+    uri: /hello
+    upstream:
+        nodes:
+            "127.0.0.1:1980": 1
+        type: roundrobin
+    plugins:
+        http-logger:
+            batch_max_size: 1
+            uri: http://127.0.0.1:1980/log
+            include_req_body: true
+            include_req_body_expr:
+                - - arg_bar
+                  - ==
+                  - foo
+#END
+--- request
+POST /hello?bar=foo
+{"test":"hello"}
+--- error_log
+"request":{"body":"{\"test\":\"hello\"}"
+
+
+
+=== TEST 8: json body with request_body, expr not hit
+--- apisix_yaml
+routes:
+  -
+    uri: /hello
+    upstream:
+        nodes:
+            "127.0.0.1:1980": 1
+        type: roundrobin
+    plugins:
+        http-logger:
+            batch_max_size: 1
+            uri: http://127.0.0.1:1980/log
+            include_resp_body: true
+            include_resp_body_expr:
+                - - arg_bar
+                  - ==
+                  - foo
+#END
+--- request
+POST /hello?bar=bar
+{"sample_payload":"hello"}
+--- no_error_log
+"request":{"body":"{\"test\":\"hello\"}"
diff --git a/t/plugin/loggly.t b/t/plugin/loggly.t
index f8d2f021d..babfa0adf 100644
--- a/t/plugin/loggly.t
+++ b/t/plugin/loggly.t
@@ -491,7 +491,111 @@ qr/message received: <14>1 [\d\-T:.]+Z [\d.]+ apisix 
[\d]+ - \[tok\@41058 tag="a
 
 
 
-=== TEST 11: collect log with log_format
+=== TEST 11: collect request log with include_req_body
+--- log_level: info
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{
+                        "plugins": {
+                            "loggly": {
+                                "customer_token" : "tok",
+                                "batch_max_size": 1,
+                                "include_req_body": true
+                            }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1982": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/opentracing"
+                }]]
+            )
+
+            local code, _, body = t("/opentracing", "POST", "body-data")
+        }
+    }
+--- error_log
+"request":{"body":"body-data"
+
+
+
+=== TEST 12: collect log with include_req_body_expr
+--- log_level: debug
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{
+                        "plugins": {
+                            "loggly": {
+                                "customer_token" : "tok",
+                                "batch_max_size": 1,
+                                "include_req_body": true,
+                                "include_req_body_expr": [
+                                    ["arg_bar", "==", "bar"]
+                                ]
+                            }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1982": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/opentracing"
+                }]]
+            )
+
+            if code >= 300 then
+                ngx.status = code
+            end
+            ngx.say(body)
+            -- this will include resp body
+            local code, _, body = t("/opentracing?bar=bar", "POST", 
"body-data")
+             if code >= 300 then
+                ngx.status = code
+                ngx.say("fail")
+                return
+            end
+            ngx.print(body)
+
+        }
+    }
+--- error_log
+"request":{"body":"body-data"
+
+
+
+=== TEST 13: collect log with include_req_body_expr mismatch
+--- log_level: debug
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, _, body = t("/opentracing?foo=bar", "POST", 
"body-data")
+            if code >= 300 then
+                ngx.status = code
+                ngx.say("fail")
+                return
+            end
+            ngx.print(body)
+
+        }
+    }
+--- no_error_log
+"request":{"body":"body-data"
+
+
+
+=== TEST 14: collect log with log_format
 --- config
     location /t {
         content_by_lua_block {
@@ -534,7 +638,7 @@ qr/message received: <14>1 [\d\-T:.]+Z [\d.]+ apisix [\d]+ 
- \[tok\@41058 tag="a
 
 
 
-=== TEST 12: loggly http protocol
+=== TEST 15: loggly http protocol
 --- config
     location /t {
         content_by_lua_block {
@@ -576,7 +680,7 @@ loggly tags: "apisix"
 
 
 
-=== TEST 13: test setup for collecting syslog with severity based on http 
response code
+=== TEST 16: test setup for collecting syslog with severity based on http 
response code
 --- config
     location /t {
         content_by_lua_block {
@@ -636,7 +740,7 @@ passed
 
 
 
-=== TEST 14: syslog PRIVAL 9 for type severity level ALERT
+=== TEST 17: syslog PRIVAL 9 for type severity level ALERT
 --- config
     location /t {
         content_by_lua_block {
@@ -654,7 +758,7 @@ qr/message received: <9>1 [\d\-T:.]+Z [\d.]+ apisix [\d]+ - 
\[tok\@41058 tag="ap
 
 
 
-=== TEST 15: syslog PRIVAL 11 for type severity level ERR
+=== TEST 18: syslog PRIVAL 11 for type severity level ERR
 --- config
     location /t {
         content_by_lua_block {
@@ -672,7 +776,7 @@ qr/message received: <11>1 [\d\-T:.]+Z [\d.]+ apisix [\d]+ 
- \[tok\@41058 tag="a
 
 
 
-=== TEST 16: log format in plugin
+=== TEST 19: log format in plugin
 --- config
     location /t {
         content_by_lua_block {
@@ -729,7 +833,7 @@ passed
 
 
 
-=== TEST 17: hit
+=== TEST 20: hit
 --- request
 GET /opentracing?foo=bar
 --- response_body
diff --git a/t/plugin/tencent-cloud-cls.t b/t/plugin/tencent-cloud-cls.t
index 6ad4d585b..6005504da 100644
--- a/t/plugin/tencent-cloud-cls.t
+++ b/t/plugin/tencent-cloud-cls.t
@@ -558,3 +558,136 @@ opentracing
 --- error_log eval
 qr/resolve ip failed, hostname: .*, error: address can't be resolved/
 --- wait: 0.5
+
+
+
+=== TEST 17: collect log with include_req_body_expr
+--- log_level: debug
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            t('/apisix/admin/plugin_metadata/tencent-cloud-cls', 
ngx.HTTP_DELETE)
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{
+                        "plugins": {
+                            "tencent-cloud-cls": {
+                                "cls_host": "127.0.0.1:10420",
+                                     "cls_topic": 
"143b5d70-139b-4aec-b54e-bb97756916de",
+                                     "secret_id": "secret_id",
+                                     "secret_key": "secret_key",
+                                     "batch_max_size": 1,
+                                     "max_retry_count": 1,
+                                     "retry_delay": 2,
+                                     "buffer_duration": 2,
+                                     "inactive_timeout": 2,
+                                     "include_req_body": true,
+                                     "include_req_body_expr": [
+                                         ["arg_bar", "==", "bar"]
+                                     ]
+                                 }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1982": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/opentracing"
+                }]]
+            )
+
+            -- this will include resp body
+            local code, _, body = t("/opentracing?bar=bar", "POST", 
"body-data")
+        }
+    }
+--- error_log
+"body":"body-data"
+
+
+
+=== TEST 18: collect log with include_req_body_expr mismatch
+--- log_level: debug
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, _, body = t("/opentracing?foo=bar", "POST", 
"body-data")
+            if code >= 300 then
+                ngx.status = code
+                ngx.say("fail")
+                return
+            end
+            ngx.print(body)
+
+        }
+    }
+--- no_error_log
+"body":"body-data"
+
+
+
+=== TEST 19: collect log with include_resp_body_expr
+--- log_level: debug
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, body = t('/apisix/admin/routes/1',
+                 ngx.HTTP_PUT,
+                 [[{
+                        "plugins": {
+                            "tencent-cloud-cls": {
+                                "cls_host": "127.0.0.1:10420",
+                                     "cls_topic": 
"143b5d70-139b-4aec-b54e-bb97756916de",
+                                     "secret_id": "secret_id",
+                                     "secret_key": "secret_key",
+                                     "batch_max_size": 1,
+                                     "max_retry_count": 1,
+                                     "retry_delay": 2,
+                                     "buffer_duration": 2,
+                                     "inactive_timeout": 2,
+                                     "include_resp_body": true,
+                                     "include_resp_body_expr": [
+                                         ["arg_bar", "==", "bar"]
+                                     ]
+                                 }
+                        },
+                        "upstream": {
+                            "nodes": {
+                                "127.0.0.1:1982": 1
+                            },
+                            "type": "roundrobin"
+                        },
+                        "uri": "/opentracing"
+                }]]
+            )
+
+            -- this will include resp body
+            local code, _, body = t("/opentracing?bar=bar", "GET")
+        }
+    }
+--- error_log
+"body":"opentracing\n"
+
+
+
+=== TEST 20: collect log with include_resp_body_expr mismatch
+--- log_level: debug
+--- config
+    location /t {
+        content_by_lua_block {
+            local t = require("lib.test_admin").test
+            local code, _, body = t("/opentracing?foo=bar", "GET")
+            if code >= 300 then
+                ngx.status = code
+                ngx.say("fail")
+                return
+            end
+            ngx.print(body)
+
+        }
+    }
+--- no_error_log
+"body":"opentracing\n"


Reply via email to