将访问日志发送到 Splunk
API7 网关可以将访问日志直接发送到 Splunk,具体方式是通过 splunk-hec-logging 插件使用 HTTP Event Collector(HEC)协议。无需单独部署日志转发器,即可在 Splunk 中集中分析日志、配置告警和创建监控面板。
本指南介绍集成流程。有关完整的插件参数和元数据参考,请参阅 splunk-hec-logging。
如果需要收集 Kubernetes Pod 中的网关错误日志,而不是从路由传输请求访问日志,请参阅将 Kubernetes 错误日志发送到 Splunk。
前置条件
- 正在运行的 API7 网关部署。
- 已启用 HTTP Event Collector(HEC)的 Splunk 实例。
- 已在 Splunk 中生成 HEC 令牌。
- 从控制台获取令牌。
步骤一:在 Splunk 中启用 HEC
- 在 Splunk 中,进入 Settings > Data Inputs > HTTP Event Collector。
- 点击 New Token 并完成以下配置:
- Name:描述性名称,例如
api7-gateway。 - Source type:
_json。 - Index:选择或创建用于存储网关日志的索引,例如
main。
- Name:描述性名称,例如
- 保存并记录 HEC 令牌。
HEC 端点 URL 通常为 https://<SPLUNK_HOST>:8088/services/collector/event。
步骤二:启用插件
可以在单个路由上启用 splunk-hec-logging(仅记录选定流量),也可以将其配置为全局规则(记录网关组中的所有流量)。请选择以下一种方式。
选项 A:按路由启用
- Admin API
- ADC
# 为上游创建服务
curl -k "https://localhost:7443/apisix/admin/services/splunk-service?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "splunk-service",
"upstream": {
"type": "roundrobin",
"nodes": [
{ "host": "httpbin.org", "port": 80, "weight": 1 }
]
}
}'
# 创建使用该服务并启用插件的路由
curl -k "https://localhost:7443/apisix/admin/routes/splunk-route?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"name": "splunk-route",
"service_id": "splunk-service",
"paths": ["/anything/*"],
"plugins": {
"splunk-hec-logging": {
"endpoint": {
"uri": "https://splunk.example.com:8088/services/collector/event",
"token": "YOUR_HEC_TOKEN"
}
}
}
}'
adc.yaml
services:
- name: splunk-service
routes:
- name: splunk-route
uris:
- /anything/*
plugins:
splunk-hec-logging:
endpoint:
uri: "https://splunk.example.com:8088/services/collector/event"
token: "YOUR_HEC_TOKEN"
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
adc sync -f adc.yaml
选项 B:全局规则
全局规则会将插件应用到网关组处理的每 个请求。仍需要至少一个路由来匹配流量。
- Admin API
- ADC
curl -k "https://localhost:7443/apisix/admin/global_rules/splunk-hec-logging?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"plugins": {
"splunk-hec-logging": {
"endpoint": {
"uri": "https://splunk.example.com:8088/services/collector/event",
"token": "YOUR_HEC_TOKEN"
}
}
}
}'
adc.yaml
global_rules:
splunk-hec-logging:
endpoint:
uri: "https://splunk.example.com:8088/services/collector/event"
token: "YOUR_HEC_TOKEN"
adc sync -f adc.yaml
可选:自定义日志格式
使用插件元数据覆盖每个事件包含的默认字段。值支持 NGINX $variable 语法。以下示例展示三个常用字段;有关完整的默认格式和所有支持的变量,请参阅 splunk-hec-logging。
- Admin API
- ADC
curl -k "https://localhost:7443/apisix/admin/plugin_metadata/splunk-hec-logging?gateway_group_id={gateway_group_id}" -X PUT \
-H "X-API-KEY: ${API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"log_format": {
"method": "$request_method",
"uri": "$request_uri",
"status": "$status"
}
}'
adc.yaml
plugin_metadata:
splunk-hec-logging:
log_format:
method: "$request_method"
uri: "$request_uri"
status: "$status"
adc sync -f adc.yaml
该元数据会应用于同一网关组中的所有 splunk-hec-logging 插件实例。
验证
通过网关发送测试请求:
curl -i "http://127.0.0.1:9080/anything/test"
在 Splunk 中,使用步骤一选择的索引搜索日志条目:
index=main source="apache-apisix-splunk-hec-logging"
应该会看到包含请求详情的事件。插件会先批量处理事件再将其发送到 Splunk,因此日志条目可能需要几秒钟才会出现。