跳到主要内容

http-logger

http-logger 插件将 APISIX 和 API7 网关的请求与响应日志作为 JSON 对象,批量发送到 HTTP 或 HTTPS 端点。它支持身份认证请求头、TLS 验证和自定义日志格式。

示例​

以下示例展示如何把网关日志发送到 HTTP 端点、通过插件元数据添加字段,以及按条件记录请求体。

要跟随示例操作,请前往 Mockbin 创建一个 bin,并保持其详情页面打开,以便检查收到的请求。将示例中的 https://your-bin-id.api.mockbin.io/ 替换为该页面显示的端点。请创建专用 bin,因为任何拥有详情页 URL 的人都可以查看捕获的请求数据。

以默认格式发送日志​

以下示例以默认 JSON 格式发送匹配请求的日志。

创建一条启用 http-logger 插件的路由,并配置 Mockbin 端点:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "http-logger-route",
"uri": "/anything",
"plugins": {
"http-logger": {
"uri": "https://your-bin-id.api.mockbin.io/",
"batch_max_size": 1
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'

示例会立即发送每条日志,便于验证。

向路由发送请求:

curl "http://127.0.0.1:9080/anything"

你应该收到 HTTP/1.1 200 OK 响应。在 Mockbin 详情页面中,捕获到的请求体应包含类似以下的字段:

{
"request": {
"method": "GET",
"uri": "/anything",
"url": "http://127.0.0.1:9080/anything"
},
"response": {
"status": 200
},
"server": {
"version": "3.18.0"
}
}

使用插件元数据添加字段​

以下示例使用插件元数据为所有 http-logger 实例添加选定的请求和响应字段。元数据值引用内置变量,因此一份配置可以应用到多条路由和多个服务。

首先,创建一个带有 http-logger 插件的路由,并配置你的服务器 URI:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "http-logger-route",
"uri": "/anything",
"plugins": {
"http-logger": {
"uri": "https://your-bin-id.api.mockbin.io/",
"batch_max_size": 1
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'

接下来,为 http-logger 配置插件元数据:

curl "http://127.0.0.1:9180/apisix/admin/plugin_metadata/http-logger" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"log_format_extra": {
"env": "$http_env",
"resp_content_type": "$sent_http_Content_Type"
}
}'

❶ 将自定义请求头 env 添加到每条默认日志记录中。

❷ 将上游响应头 Content-Type 添加到每条默认日志记录中。

向路由发送带有 env 头的请求:

curl "http://127.0.0.1:9080/anything" -H "env: dev"

你应该收到 HTTP/1.1 200 OK 响应。在 Mockbin 详情页面中,捕获到的请求体应包含类似以下的字段:

{
"env": "dev",
"resp_content_type": "application/json"
}

有条件地记录请求体​

以下示例演示了如何有条件地记录请求体。

创建如下配置 http-logger 插件的路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "http-logger-route",
"uri": "/anything",
"plugins": {
"http-logger": {
"uri": "https://your-bin-id.api.mockbin.io/",
"include_req_body": true,
"include_req_body_expr": [["arg_log_body", "==", "yes"]],
"batch_max_size": 1
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'

❶ include_req_body: 设置为 true 以包含请求体。

❷ include_req_body_expr: 仅当 URL 查询字符串 log_body 为 yes 时才包含请求体。

向路由发送满足条件的带有 URL 查询字符串的请求:

curl -i "http://127.0.0.1:9080/anything?log_body=yes" -X POST -d '{"env": "dev"}'

你应该看到记录的请求体:

{
"request": {
"querystring": {
"log_body": "yes"
},
"body": "{\"env\": \"dev\"}"
}
}

向路由发送不带任何 URL 查询字符串的请求:

curl -i "http://127.0.0.1:9080/anything" -X POST -d '{"env": "dev"}'

你不应在日志中观察到请求体。

信息

默认日志记录会包含插件收集的请求体和响应体。如果配置 log_format,请显式包含相应变量:

{
"include_req_body": true,
"include_resp_body": true,
"log_format": {
"request_body": "$request_body",
"response_body": "$resp_body"
}
}

请求体和响应体大小限制仍然适用。如需在不替换默认日志条目的情况下添加自定义字段,请使用 log_format_extra。