跳到主要内容

syslog

syslog 插件将 APISIX 和 API7 网关的请求及响应日志作为 JSON 对象分批发送到 Syslog 服务器。它支持 TCP、UDP、TLS 和自定义日志格式。

示例​

以下示例展示如何把网关请求日志发送到 Syslog Collector、自定义日志内容,以及按条件记录请求体。

要跟随示例操作,请准备一个 Syslog Collector:

固定版本的 rsyslog Collector 镜像仅发布 amd64 版本。设置正在运行的 APISIX 或 API7 网关容器名称:

export GATEWAY_CONTAINER=replace-with-gateway-container-name

创建专用网络:

docker network create gateway-rsyslog-net

将网关连接到该网络:

docker network connect gateway-rsyslog-net "$GATEWAY_CONTAINER"

启动已启用 TCP 接收的 Collector:

docker run -d \
--platform linux/amd64 \
--name rsyslog-collector \
--network gateway-rsyslog-net \
-e ENABLE_TCP=on \
-e ENABLE_UDP=off \
rsyslog/rsyslog-collector:2026-04

设置 APISIX Admin API 和 ADC 示例使用的 Collector 主机名:

export SYSLOG_HOST=rsyslog-collector

在另一个终端中跟踪 Collector 收到的日志:

docker exec rsyslog-collector tail -f /var/log/all.log

将日志发送到 Syslog 服务器​

以下示例在路由上启用 syslog 插件,并将匹配请求的日志发送到 Collector。

创建一个路由并在其上启用 syslog:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<EOF
{
"id": "syslog-route",
"uri": "/anything",
"plugins": {
"syslog": {
"host": "$SYSLOG_HOST",
"port": 514,
"flush_limit": 1
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}
EOF

❶ 配置网关可访问的 Collector 主机名。

❷ port: 替换为你的 syslog 服务器端口。

❸ flush_limit:设置为 1,以便立即将日志推送到 syslog 服务器。

发送一个请求到该路由:

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

你应该收到 HTTP/1.1 200 OK 响应。

在 Collector 日志中,JSON 消息应包含类似以下字段:

{
"upstream": "100.31.16.17:80",
"service_id": "",
"client_ip": "192.168.155.1",
"response": {
"headers": {
"date": "Mon, 21 Sep 2026 09:44:46 GMT",
"content-type": "application/json",
"access-control-allow-origin": "*",
"server": "APISIX/3.18.0",
"access-control-allow-credentials": "true",
"connection": "close",
"content-length": "399"
},
"size": 627,
"status": 200
},
"start_time": 1789983884322,
"apisix_latency": 650.00001144409,
"latency": 1513.0000114441,
"upstream_latency": 863,
"request": {
"size": 85,
"uri": "/anything",
"headers": {
"x-forwarded-proto": "http",
"user-agent": "curl/8.7.1",
"accept": "*/*",
"host": "127.0.0.1:9080",
"x-forwarded-port": "9080",
"x-forwarded-host": "127.0.0.1:9080"
},
"querystring": {},
"url": "http://127.0.0.1:9080/anything",
"method": "GET"
},
"route_id": "syslog-route",
"server": {
"version": "3.18.0",
"hostname": "dd2886d0b7bf"
}
}

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

以下示例使用插件元数据和内置变量,为未自行定义 log_format_extra 的 syslog 实例添加选定的请求和响应字段。

创建一个启用 syslog 插件的路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<EOF
{
"id": "syslog-route",
"uri": "/anything",
"plugins": {
"syslog": {
"host": "$SYSLOG_HOST",
"port": 514,
"flush_limit": 1
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}
EOF

配置 syslog 的插件元数据:

curl "http://127.0.0.1:9180/apisix/admin/plugin_metadata/syslog" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"log_format_extra": {
"host": "$host",
"@timestamp": "$time_iso8601",
"route_id": "$route_id",
"client_ip": "$remote_addr",
"resp_content_type": "$sent_http_Content_Type"
}
}'

发送一个请求到该路由:

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

在 Collector 日志中,JSON 消息应包含类似以下字段:

{
"@timestamp": "2026-04-17T05:39:46+00:00",
"resp_content_type": "application/json",
"host": "127.0.0.1",
"route_id": "syslog-route",
"client_ip": "192.168.155.1"
}

有条件地记录请求体​

以下示例仅在查询参数满足配置的表达式时记录请求体。

创建一个启用 syslog 插件的路由如下:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d @- <<EOF
{
"id": "syslog-route",
"uri": "/anything",
"plugins": {
"syslog": {
"host": "$SYSLOG_HOST",
"port": 514,
"flush_limit": 1,
"include_req_body": true,
"include_req_body_expr": [["arg_log_body", "==", "yes"]]
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}
EOF

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

❷ include_req_body_expr:仅当 URL 查询字符串 log_body 为 yes 时包含请求体。在基于 YAML 的配置中,请用引号括起 "yes",以避免 YAML 将其转换为布尔值。

发送一个满足条件的请求到该路由:

curl -i "http://127.0.0.1:9080/anything?log_body=yes" -X POST \
-H "Content-Type: application/json" \
-d '{"env":"dev"}'

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

{
"upstream": "52.71.230.193:80",
"service_id": "",
"client_ip": "192.168.155.1",
"response": {
"headers": {
"date": "Mon, 21 Sep 2026 09:19:41 GMT",
"content-type": "application/json",
"access-control-allow-origin": "*",
"access-control-allow-credentials": "true",
"server": "APISIX/3.18.0",
"connection": "close",
"content-length": "543"
},
"size": 771,
"status": 200
},
"start_time": 1789982377612,
"apisix_latency": 2.0000038146973,
"latency": 3921.0000038147,
"upstream_latency": 3919,
"request": {
"size": 164,
"body": "{\"env\":\"dev\"}",
"uri": "/anything?log_body=yes",
"headers": {
"x-forwarded-port": "9080",
"content-type": "application/json",
"x-forwarded-proto": "http",
"user-agent": "curl/8.7.1",
"accept": "*/*",
"host": "127.0.0.1:9080",
"x-forwarded-host": "127.0.0.1:9080",
"content-length": "13"
},
"querystring": {
"log_body": "yes"
},
"url": "http://127.0.0.1:9080/anything?log_body=yes",
"method": "POST"
},
"route_id": "syslog-route",
"server": {
"version": "3.18.0",
"hostname": "dd2886d0b7bf"
}
}

发送一个不带 URL 查询字符串的请求到该路由:

curl -i "http://127.0.0.1:9080/anything" -X POST \
-H "Content-Type: application/json" \
-d '{"env":"dev"}'

你不应该在日志中看到请求体。

信息

上文使用的 log_format_extra 会保留默认日志条目,包括插件收集的请求体和响应体。如果改为配置 log_format,请显式包含对应变量:

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

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