rocketmq-logger
rocketmq-logger 插件批量将网关请求和响应日志发送到 Apache RocketMQ。它支持默认的结构化日志格式、原始 HTTP 请求格式以及自定义日志字段。
示例
以下示例演示如何为常见日志场景配置 rocketmq-logger 插件。
要完成这些示例,请启动 RocketMQ NameServer 和 Broker。Docker 设置使用专用网络,使正在运行的 APISIX 或 API7 网关容器能够通过容器名称访问 RocketMQ。
- Docker
- Kubernetes
将 GATEWAY_CONTAINER 设置为正在运行的 APISIX 或 API7 网关容器名称。创建专用 Docker 网络并将网关连接到该网络:
export GATEWAY_CONTAINER=replace-with-gateway-container-name
docker network create gateway-rocketmq-net
docker network connect gateway-rocketmq-net "$GATEWAY_CONTAINER"
创建 Docker Compose 文件:
services:
rocketmq-namesrv:
image: apache/rocketmq:5.5.0
container_name: rocketmq-namesrv
restart: unless-stopped
command: ["nameserver"]
networks:
- gateway-rocketmq-net
rocketmq-broker:
image: apache/rocketmq:5.5.0
container_name: rocketmq-broker
restart: unless-stopped
depends_on:
- rocketmq-namesrv
environment:
NAMESRV_ADDR: rocketmq-namesrv:9876
command: ["broker", "-n", "rocketmq-namesrv:9876"]
networks:
- gateway-rocketmq-net
networks:
gateway-rocketmq-net:
external: true
启动容器:
docker compose up -d
等待 Broker 向 NameServer 注册:
until docker exec rocketmq-namesrv sh mqadmin clusterList \
-n rocketmq-namesrv:9876 2>/dev/null | grep -q "DefaultCluster"; do
sleep 2
done
创建 TopicTest 主题:
docker exec rocketmq-namesrv sh mqadmin updateTopic \
-n rocketmq-namesrv:9876 \
-t TopicTest \
-c DefaultCluster
为 RocketMQ NameServer 和 Broker 创建 Kubernetes 清单:
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: aic
name: rocketmq-namesrv
spec:
replicas: 1
selector:
matchLabels:
app: rocketmq-namesrv
template:
metadata:
labels:
app: rocketmq-namesrv
spec:
containers:
- name: rocketmq-namesrv
image: apache/rocketmq:5.5.0
args:
- nameserver
ports:
- containerPort: 9876
---
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: rocketmq-namesrv
spec:
selector:
app: rocketmq-namesrv
ports:
- port: 9876
targetPort: 9876
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: aic
name: rocketmq-broker
spec:
replicas: 1
selector:
matchLabels:
app: rocketmq-broker
template:
metadata:
labels:
app: rocketmq-broker
spec:
containers:
- name: rocketmq-broker
image: apache/rocketmq:5.5.0
args:
- broker
- -n
- rocketmq-namesrv:9876
env:
- name: NAMESRV_ADDR
value: rocketmq-namesrv:9876
ports:
- containerPort: 10909
- containerPort: 10911
- containerPort: 10912
---
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: rocketmq-broker
spec:
selector:
app: rocketmq-broker
ports:
- name: fast-listen
port: 10909
targetPort: 10909
- name: listen
port: 10911
targetPort: 10911
- name: ha-service
port: 10912
targetPort: 10912
在配置的 RocketMQ 主题中等待消息:
kubectl apply -f rocketmq-deployment.yaml
等待 Deployment 可用:
kubectl rollout status -n aic deployment/rocketmq-namesrv
kubectl rollout status -n aic deployment/rocketmq-broker
等待 Broker 向 NameServer 注册:
until kubectl exec -n aic deployment/rocketmq-namesrv -- \
sh mqadmin clusterList \
-n rocketmq-namesrv:9876 2>/dev/null | grep -q "DefaultCluster"; do
sleep 2
done
创建 TopicTest Topic:
kubectl exec -n aic deployment/rocketmq-namesrv -- \
sh mqadmin updateTopic \
-n rocketmq-namesrv:9876 \
-t TopicTest \
-c DefaultCluster
以下 Admin API 和 ADC 示例使用 Docker 环境及其 rocketmq-namesrv:9876 地址。Ingress Controller 示例使用 Kubernetes 环境及其 rocketmq-namesrv.aic.svc:9876 服务地址。如果使用其他组合,请将该地址替换为网关可访问的 RocketMQ NameServer 端点。
检查 RocketMQ 消息
在以下示例中发送请求后,请使用与你的环境对应的命令检查 TopicTest 中的消息:
- Docker
- Kubernetes
docker exec rocketmq-namesrv sh mqadmin printMsg \
-n rocketmq-namesrv:9876 \
-t TopicTest
kubectl exec -n aic deployment/rocketmq-namesrv -- \
sh mqadmin printMsg \
-n rocketmq-namesrv:9876 \
-t TopicTest
比较结构化日志与原始请求日志
default 元数据格式发送结构化 JSON 日志条目,而 origin 格式发送原始 HTTP 请求。此示例会配置这两种格式,以便比较它们的输出。
创建一个启用 rocketmq-logger 的路由,如下所示:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes/rocketmq-logger-route" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"uri": "/anything",
"plugins": {
"rocketmq-logger": {
"nameserver_list": [ "rocketmq-namesrv:9876" ],
"topic": "TopicTest",
"key": "key1",
"timeout": 30,
"meta_format": "default",
"batch_max_size": 1
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'
services:
- name: httpbin
routes:
- uris:
- /anything
name: rocketmq-logger-route
plugins:
rocketmq-logger:
nameserver_list:
- "rocketmq-namesrv:9876"
topic: "TopicTest"
key: "key1"
timeout: 30
meta_format: "default"
batch_max_size: 1
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
ADC 会将服务作为期望状态进行协调。标签选择器将此示例限制在其自身带标签的资源内。请先预览限定范围的变更,并确认其中没有意外更新或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=rocketmq-logger
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=rocketmq-logger
- Gateway API
- APISIX CRD
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: httpbin-external-domain
spec:
type: ExternalName
externalName: httpbin.org
---
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: rocketmq-logger-plugin-config
spec:
plugins:
- name: rocketmq-logger
config:
nameserver_list:
- "rocketmq-namesrv.aic.svc:9876"
topic: "TopicTest"
key: "key1"
timeout: 30
meta_format: "default"
batch_max_size: 1
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: aic
name: rocketmq-logger-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: PathPrefix
value: /anything
filters:
- type: ExtensionRef
extensionRef:
group: apisix.apache.org
kind: PluginConfig
name: rocketmq-logger-plugin-config
backendRefs:
- name: httpbin-external-domain
port: 80
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: aic
name: httpbin-external-domain
spec:
ingressClassName: apisix
externalNodes:
- type: Domain
name: httpbin.org
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: rocketmq-logger-route
spec:
ingressClassName: apisix
http:
- name: rocketmq-logger-route
match:
paths:
- /anything*
upstreams:
- name: httpbin-external-domain
plugins:
- name: rocketmq-logger
enable: true
config:
nameserver_list:
- "rocketmq-namesrv.aic.svc:9876"
topic: "TopicTest"
key: "key1"
timeout: 30
meta_format: "default"
batch_max_size: 1
应用配置:
kubectl apply -f rocketmq-logger-ic.yaml
❶ meta_format:使用结构化 JSON 日志格式。
❷ batch_max_size:为便于测试,立即发送每条日志。
向路由发送请求以生成日志条目:
curl -i "http://127.0.0.1:9080/anything"
使用与你的环境对应的检查命令。消息体应包含与以下内容类似的日志条目:
{
"client_ip": "127.0.0.1",
"upstream": "34.197.122.172:80",
"start_time": 1789377954622,
"request": {
"headers": {
"host": "127.0.0.1:9080",
"accept": "*/*",
"user-agent": "curl/8.6.0"
},
"querystring": {},
"size": 86,
"uri": "/anything",
"url": "http://127.0.0.1:9080/anything",
"method": "GET"
},
"route_id": "rocketmq-logger-route",
"apisix_latency": 8.9998455047607,
"upstream_latency": 503,
"latency": 511.99984550476,
"response": {
"size": 617,
"headers": {
"content-length": "391",
"connection": "close",
"date": "Mon, 14 Sep 2026 09:25:54 GMT",
"server": "APISIX/3.18.0",
"content-type": "application/json"
},
"status": 200
},
"server": {
"hostname": "apisix",
"version": "3.18.0"
},
"service_id": ""
}
将 rocketmq-logger 的元日志格式更新为 origin:
- Admin API
- ADC
- Ingress Controller
curl "http://127.0.0.1:9180/apisix/admin/routes/rocketmq-logger-route" -X PATCH \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"plugins": {
"rocketmq-logger": {
"meta_format": "origin"
}
}
}'
更新 adc.yaml,将 meta_format 修改为 origin:
services:
- name: httpbin
routes:
- uris:
- /anything
name: rocketmq-logger-route
plugins:
rocketmq-logger:
nameserver_list:
- "rocketmq-namesrv:9876"
topic: "TopicTest"
key: "key1"
timeout: 30
meta_format: "origin"
batch_max_size: 1
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
ADC 会将服务作为期望状态进行协调。标签选择器将此示例限制在其自身带标签的资源内。请先预览限定范围的变更,并确认其中没有意外更新或删除:
adc diff -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=rocketmq-logger
同步已审查的服务配置:
adc sync -f adc.yaml \
--include-resource-type service \
--label-selector docs-example=rocketmq-logger
- Gateway API
- APISIX CRD
更新 rocketmq-logger-ic.yaml,将 PluginConfig 中的 meta_format 更改为 origin:
apiVersion: apisix.apache.org/v1alpha1
kind: PluginConfig
metadata:
namespace: aic
name: rocketmq-logger-plugin-config
spec:
plugins:
- name: rocketmq-logger
config:
nameserver_list:
- "rocketmq-namesrv.aic.svc:9876"
topic: "TopicTest"
key: "key1"
timeout: 30
meta_format: "origin"
batch_max_size: 1
应用更新后的配置:
kubectl apply -f rocketmq-logger-ic.yaml
更新 rocketmq-logger-ic.yaml,将 ApisixRoute 中的 meta_format 更改为 origin:
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: rocketmq-logger-route
spec:
ingressClassName: apisix
http:
- name: rocketmq-logger-route
match:
paths:
- /anything*
upstreams:
- name: httpbin-external-domain
plugins:
- name: rocketmq-logger
enable: true
config:
nameserver_list:
- "rocketmq-namesrv.aic.svc:9876"
topic: "TopicTest"
key: "key1"
timeout: 30
meta_format: "origin"
batch_max_size: 1
应用更新后的配置:
kubectl apply -f rocketmq-logger-ic.yaml
再次向路由发送请求以生成新的日志条目:
curl -i "http://127.0.0.1:9080/anything"
再次使用检查命令。新消息体应包含原始 HTTP 格式的请求:
GET /anything HTTP/1.1
host: 127.0.0.1:9080
user-agent: curl/8.6.0
accept: */*