记录 API 流量日志
API7 企业版支持记录包含主机、客户端 IP 地址和请求时间戳等信息的路由访问日志。这些日志可以帮助识别和解决问题。
API7 企业版通过其插件系统集成了许多日志平台。开箱即用的集成包括以下内容:
- HTTP/TCP/UDP 日志服务器
- SkyWalking
- Kafka
- RocketMQ
- ClickHouse
- Syslog
- 阿里云 SLS
- Google Cloud Logging Service
- Splunk HTTP Event Collector (HEC)
- File logging
- Elasticsearch
- 腾讯云 CLS
- Grafana Loki
本教程将指导你配置 clickhouse-logger 插件,以将 API 流量日志记录到 ClickHouse 数据库中。
前置条件
启动 ClickHouse 服务器
- Docker
- Kubernetes
在 Docker 中启动一个名为 quickstart-clickhouse-server 的 ClickHouse 实例,默认数据库为 quickstart_db,默认用户为 quickstart-user,密码为 quickstart-pass:
docker run -d \
--name quickstart-clickhouse-server \
--network=api7-ee_api7 \
-e CLICKHOUSE_DB=quickstart_db \
-e CLICKHOUSE_USER=quickstart-user \
-e CLICKHOUSE_PASSWORD=quickstart-pass \
-e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 \
--ulimit nofile=262144:262144 \
clickhouse/clickhouse-server
在本地或 Docker 中使用命令行工具 clickhouse-client 连接到 ClickHouse 实例:
docker exec -it quickstart-clickhouse-server clickhouse-client
在数据库 quickstart_db 中创建一个包含 String 类型的 host、client_ip、route_id 和 @timestamp 字段的表 test,你也可以根据需要进行修改:
CREATE TABLE quickstart_db.test (
`host` String,
`client_ip` String,
`route_id` String,
`@timestamp` String,
PRIMARY KEY(`@timestamp`)
) ENGINE = MergeTree()
如果成功,你应该在输出中看到 Ok。
输入 exit 以退出 Docker 容器。
安装 ClickHouse Operator
如果你在 Kubernetes 上安装了网关实例并使用 Ingress Controller 进行配置,请安装 ClickHouse Operator:
curl -s "https://raw.githubusercontent.com/Altinity/clickhouse-operator/master/deploy/operator-web-installer/clickhouse-operator-install.sh" | OPERATOR_NAMESPACE=<YOUR_NAMESPACE> bash
检查所有资源:
kubectl get all
你应该会看到以下 ClickHouse operator 资源:
NAME READY STATUS RESTARTS AGE
pod/clickhouse-operator-56c57f989-kjqtn 2/2 Running 0 32m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/clickhouse-operator-metrics ClusterIP 10.96.253.156 <none> 8888/TCP,9999/TCP 32m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/clickhouse-operator 1/1 1 1 32m
NAME DESIRED CURRENT READY AGE
replicaset.apps/clickhouse-operator-56c57f989 1 1 1 32m
安装 ClickHouse 服务器
创建一个用于简单的 1 分片 1 副本安装的清单文件:
apiVersion: clickhouse.altinity.com/v1
kind: ClickHouseInstallation
metadata:
namespace: api7
name: clickhouse-installation
spec:
configuration:
users:
quickstart-user/password_sha256_hex: c019743ba8bc32d17800bca6d36de903feff9854897c61b6e63ce3e5e93c37ca
quickstart-user/password: quickstart-pass
quickstart-user/networks/ip:
- 0.0.0.0/0
clusters:
- name: simple
将配置应用到你的集群:
kubectl apply -f clickhouse-installation.yaml
检查正在运行的 Pod:
kubectl get pod
你应该会看到 ClickHouse 服务器 Pod 正在运行:
NAME READY STATUS RESTARTS AGE
chi-clickhouse-installation-simple-0-0-0 1/1 Running 0 11m
配置 ClickHouse 服务器
连接到 ClickHouse 实例:
kubectl exec -it chi-clickhouse-installation-simple-0-0-0 -- clickhouse-client
创建数据库:
CREATE DATABASE quickstart_db
在数据库 quickstart_db 中创建一个包含 String 类型的 host、client_ip、route_id 和 @timestamp 字段的表 test,你也可以根据需要进行修改:
CREATE TABLE quickstart_db.test (
`host` String,
`client_ip` String,
`route_id` String,
`@timestamp` String,
PRIMARY KEY(`@timestamp`)
) ENGINE = MergeTree()
如果成功,你应该在输出中看到 Ok。
输入 exit 以退出 ClickHouse 服务器。
为所有服务配置日志记录
强烈建议在全局规则中启用日志插件,以确保所有到服务和路由的流量都能被一致地追踪。
- Dashboard
- ADC
- Ingress Controller
- 从侧边导航栏中选择网关组的 Plugin Settings(插件设置)。
- 选择 Plugin Global Rules(插件全局规则)选项卡,然后点击 Enable Plugin(启用插件)。
- 在 Plugins(插件)字段中搜索
clickhouse-logger插件,然后点击 Enable(启用)。 - 在对话框中执行以下操作:
-
将以下配置应用到 JSON Editor:
{
"log_format": {
"host": "$host",
"@timestamp": "$time_iso8601",
"client_ip": "$remote_addr"
},
"user": "quickstart-user",
"password": "quickstart-pass",
"database": "quickstart_db",
"logtable": "test",
"endpoint_addrs": ["http://quickstart-clickhouse-server:8123"]
} -
点击 Enable(启用)。
要使用 ADC 启用日志记录,请创建以下配置:
global_rules:
clickhouse-logger:
_meta:
disable: false
database: quickstart_db
endpoint_addrs:
- http://quickstart-clickhouse-server:8123
log_format:
"@timestamp": $time_iso8601
client_ip: $remote_addr
host: $host
logtable: test
password: quickstart-pass
user: quickstart-user
将配置同步到 API7 企业版:
adc sync -f adc.yaml
ADC 将配置文件用作单一事实来源。请确保使用 -f 标志将所有配置文件传递给 adc sync 命令。
- Gateway API
- APISIX CRD
更新你的 GatewayProxy 清单,以将 clickhouse-logger 启用为全局插件:
apiVersion: apisix.apache.org/v1alpha1
kind: GatewayProxy
metadata:
namespace: api7
name: apisix
spec:
provider:
type: ControlPlane
controlPlane:
endpoints:
- https://xxx.xxx.xxx.xxx:7443 # 更新为你的 CP 端点
auth:
type: AdminKey
adminKey:
value: xxxxxxxxxxx # 更新为你的 Admin Key
plugins:
- name: clickhouse-logger
enabled: true
config:
endpoint_addr: http://clickhouse-clickhouse-installation:8123
user: quickstart-user
password: quickstart-pass
logtable: test
database: quickstart_db
log_format:
"@timestamp": $time_iso8601
client_ip: $remote_addr
host: $host
将配置应用到你的集群:
kubectl apply -f gateway-proxy.yaml
创建一个用于全局 clickhouse-logger 插件的 Kubernetes 清单文件:
apiVersion: apisix.apache.org/v2
kind: ApisixGlobalRule
metadata:
namespace: api7
name: global-clickhouse
spec:
ingressClassName: apisix
plugins:
- name: clickhouse-logger
enable: true
config:
endpoint_addr: http://clickhouse-clickhouse-installation:8123
user: quickstart-user
password: quickstart-pass
logtable: test
database: quickstart_db
log_format:
"@timestamp": $time_iso8601
client_ip: $remote_addr
host: $host
将配置应用到你的集群:
kubectl apply -f global-clickhouse-logger.yaml
验证
向路由发送请求以生成访问日志条目:
curl -i "http://127.0.0.1:9080/ip"
- Docker
- Kubernetes
在 Docker 中使用命令行工具 clickhouse-client 连接到 ClickHouse 数据库:
docker exec -it quickstart-clickhouse-server clickhouse-client
连接到 ClickHouse 数据库:
kubectl exec -it chi-clickhouse-installation-simple-0-0-0 -- clickhouse-client
查询表 quickstart_db.test 中的所有记录:
SELECT * from quickstart_db.test
你应该会看到类似以下的访问日志条目:
┌─host──────┬─client_ip─┬─route_id─┬─@timestamp────────────────┐
1. │ 127.0.0.1 │ 127.0.0.1 │ 23654f0 │ 2025-07-31T03:10:57+00:00 │
└───────────┴───────────┴──────────┴───────────────────────────┘