使用 ClickHouse 记录日志
APISIX 支持收集路由访问信息并将其记录为日志,例如主机、客户端 IP 和请求时间戳。这些关键信息将对解决相关问题大有帮助。
ClickHouse 是一个开源的面向列的数据库管理系统 (DBMS),用于在线分析处理 (OLAP)。它允许用户使用 SQL 查询实时生成分析报告,例如日志分析。
本指南将向你展示如何启用 clickhouse-logger 插件将 APISIX 日志记录到 ClickHouse 数据库中。
前置条件
配置 ClickHouse
启动一个名为 quickstart-clickhouse-server 的 ClickHouse 实例,默认数据库为 quickstart_db,默认用户为 quickstart-user,密码为 quickstart-pass:
- Docker
- Kubernetes
docker run -d \
--name quickstart-clickhouse-server \
--network=apisix-quickstart-net \
-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
安装 ClickHouse Operator:
IC_NAMESPACE=replace-with-your-namespace
curl -s "https://raw.githubusercontent.com/Altinity/clickhouse-operator/master/deploy/operator-web-installer/clickhouse-operator-install.sh" | OPERATOR_NAMESPACE=$IC_NAMESPACE bash
为简单的 1 分片 1 副本安装创建一个清单文件:
apiVersion: clickhouse.altinity.com/v1
kind: ClickHouseInstallation
metadata:
namespace: ingress-apisix
name: quickstart-clickhouse-server
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-quickstart-clickhouse-server-simple-0-0-0 1/1 Running 0 11m
连接到 ClickHouse 实例:
kubectl exec -it chi-quickstart-clickhouse-server-simple-0-0-0 -- clickhouse-client
创建一个数据库:
CREATE DATABASE quickstart_db
在数据库 quickstart_db 中创建表 test,包含 String 类型的字段 host、client_ip、route_id、@timestamp,或根据你的需要相应调整命令:
CREATE TABLE quickstart_db.test (
`host` String,
`client_ip` String,
`route_id` String,
`@timestamp` String,
PRIMARY KEY(`@timestamp`)
) ENGINE = MergeTree()
如果成功,你应该在输出中看到 Ok。
输入 exit 退出 Docker 中的命令行界面。
启用 clickhouse-logger 插件
全局启用 clickhouse-logger 插件。或者,你可以在路由上启用该插件。
- Admin API
- ADC
- Ingress Controller
全局启用 clickhouse-logger 插件:
curl -i "http://127.0.0.1:9180/apisix/admin/global_rules" -X PUT -d '
{
"id": "clickhouse",
"plugins": {
"clickhouse-logger": {
// Annotate 1
"log_format": {
"host": "$host",
"@timestamp": "$time_iso8601",
"client_ip": "$remote_addr"
},
// Annotate 2
"user": "quickstart-user",
"password": "quickstart-pass",
"database": "quickstart_db",
"logtable": "test",
"endpoint_addrs": ["http://quickstart-clickhouse-server:8123"]
}
}
}'
➊ 指定日志格式中对应 ClickHouse 表的字段
➋ ClickHouse 服务器信息
创建一个你将收集日志的示例路由:
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
"id": "getting-started-ip",
"uri": "/ip",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'
全局启用 clickhouse-logger 插件:
global_rules:
clickhouse-logger:
// Annotate 1
log_format:
host: "$host"
"@timestamp": "$time_iso8601"
client_ip: "$remote_addr"
// Annotate 2
user: "quickstart-user"
password: "quickstart-pass"
database: "quickstart_db"
logtable: "test"
endpoint_addrs:
- "http://quickstart-clickhouse-server:8123"
➊ 指定日志格式中对应 ClickHouse 表的字段。
➋ ClickHouse 服务器信息。
创建一个你将收集日志的示例路由:
services:
- name: httpbin Service
routes:
- uris:
- /ip
name: getting-started-ip
upstream:
type: roundrobin
nodes:
- host: httpbin.org
port: 80
weight: 1
将配置同步到 APISIX:
adc sync -f adc-global-rule.yaml -f adc-route.yaml
- Gateway API
- APISIX CRD
创建一个 Kubernetes 清单文件以全局启用 clickhouse-logger:
apiVersion: apisix.apache.org/v1alpha1
kind: GatewayProxy
metadata:
namespace: ingress-apisix
name: apisix-config
spec:
plugins:
- name: clickhouse-logger
enabled: true
config:
// Annotate 1
log_format:
host: "$host"
"@timestamp": "$time_iso8601"
client_ip: "$remote_addr"
// Annotate 2
user: "quickstart-user"
password: "quickstart-pass"
database: "quickstart_db"
logtable: "test"
endpoint_addrs:
- "http://clickhouse-quickstart-clickhouse-server:8123"
➊ 指定日志格式中对应 ClickHouse 表的字段。
➋ ClickHouse 服务器信息。
为你要收集日志的示例路由创建另一个 Kubernetes 清单文件:
apiVersion: v1
kind: Service
metadata:
namespace: ingress-apisix
name: httpbin-external-domain
spec:
type: ExternalName
externalName: httpbin.org
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
namespace: ingress-apisix
name: getting-started-ip
spec:
parentRefs:
- name: apisix
rules:
- matches:
- path:
type: Exact
value: /ip
backendRefs:
- name: httpbin-external-domain
port: 80
创建一个 Kubernetes 清单文件以全局启用 clickhouse-logger:
apiVersion: apisix.apache.org/v2
kind: ApisixGlobalRule
metadata:
namespace: ingress-apisix
name: global-clickhouse
spec:
ingressClassName: apisix
plugins:
- name: clickhouse-logger
enable: true
config:
// Annotate 1
log_format:
host: "$host"
"@timestamp": "$time_iso8601"
client_ip: "$remote_addr"
// Annotate 2
user: "quickstart-user"
password: "quickstart-pass"
database: "quickstart_db"
logtable: "test"
endpoint_addrs:
- "http://clickhouse-quickstart-clickhouse-server:8123"
➊ 指定日志格式中对应 ClickHouse 表的字段。
➋ ClickHouse 服务器信息。
为你要收集日志的示例路由创建另一个 Kubernetes 清单文件:
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: ingress-apisix
name: httpbin-external-domain
spec:
ingressClassName: apisix
externalNodes:
- type: Domain
name: httpbin.org
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: ingress-apisix
name: getting-started-ip
spec:
ingressClassName: apisix
http:
- name: getting-started-ip
match:
paths:
- /ip
upstreams:
- name: httpbin-external-domain
将配置应用到你的集群:
kubectl apply -f global-clickhouse.yaml -f httpbin-route.yaml
批量提交日志
clickhouse-logger 插件支持使用批处理器聚合和处理日志。这避免了频繁向 ClickHouse 提交日志条目,这会降低操作速度。
默认情况下,批处理器每 5 秒或当批处理中的数据大小达到 1000 KB 时提交数据。你可以调整插件的提交时间间隔 inactive_timeout 和最大批处理大小 batch_max_size。例如,这是将 inactive_timeout 设置为 10 秒并将 batch_max_size 设置为 2000 KB 的方法:
- Admin API
- ADC
- Ingress Controller
curl -i "http://127.0.0.1:9180/apisix/admin/global_rules/clickhouse" -X PATCH -d '
{
"plugins": {
"clickhouse-logger": {
"batch_max_size": 2000,
"inactive_timeout": 10
}
}
}'
更新你的全局规则配置,将 inactive_timeout 设置为 10 秒,将 batch_max_size 设置为 2000 KB:
global_rules:
clickhouse-logger:
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"
batch_max_size: 2000
inactive_timeout: 10
将配置同步到 APISIX:
adc sync -f adc-global-rule.yaml -f adc-route.yaml
- Gateway API
- APISIX CRD
apiVersion: apisix.apache.org/v1alpha1
kind: GatewayProxy
metadata:
namespace: ingress-apisix
name: apisix-config
spec:
plugins:
- name: clickhouse-logger
enabled: true
config:
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://clickhouse-quickstart-clickhouse-server:8123"
batch_max_size: 2000
inactive_timeout: 10
apiVersion: apisix.apache.org/v2
kind: ApisixGlobalRule
metadata:
namespace: ingress-apisix
name: global-clickhouse
spec:
ingressClassName: apisix
plugins:
- name: clickhouse-logger
enable: true
config:
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://clickhouse-quickstart-clickhouse-server:8123"
batch_max_size: 2000
inactive_timeout: 10
验证日志记录
向路由发送请求以生成访问日志条目:
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-quickstart-clickhouse-server-simple-0-0-0 -- clickhouse-client
查询表 quickstart_db.test 中的所有记录:
SELECT * from quickstart_db.test
你应该看到类似以下的访问记录,这验证了 clickhouse-logger 插件按预期工作。
┌─host──────┬─client_ip─┬─route_id─┬─@timestamp────────────────┐
1. │ 127.0.0.1 │ 127.0.0.1 │ 5e835ead │ 2025-08-12T09:17:04+00:00 │
└───────────┴───────────┴──────────┴───────────────────────────┘
下一步
参阅 clickhouse-logger 插件文档以了解更多有关插件配置选项的信息。