avatar

Ryan's Blog

The first step is always the hardest.

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于
  • 工具
Home APISIX kafka-logger 日志采集实践:写入 Kafka 并接入 Elasticsearch / Kibana
文章

APISIX kafka-logger 日志采集实践:写入 Kafka 并接入 Elasticsearch / Kibana

Posted 2022-08-12 Updated 3 days ago
By Ryan Chen
18~24 min read

APISIX 作为 API 网关,天然位于流量入口位置,非常适合采集请求日志。通过 kafka-logger 插件,可以将网关访问日志写入 Kafka,再由 Logstash 消费并写入 Elasticsearch,最终在 Kibana 中检索和分析。

这篇文章整理一条常见链路:

Client -> APISIX -> kafka-logger -> Kafka -> Logstash -> Elasticsearch -> Kibana

如果还不了解 APISIX 插件和 Dashboard,可以先阅读:

  • APISIX 入门指南:核心概念、Docker 部署与基础路由配置
  • APISIX Dashboard 使用指南:路由、服务、上游与插件配置实践

为什么要把 APISIX 日志写入 Kafka

直接把日志写入 Elasticsearch 当然也可以,但引入 Kafka 有几个好处:

  • 削峰填谷,避免日志高峰直接冲击 Elasticsearch。
  • 解耦 APISIX 与日志存储系统。
  • 支持多个消费者,例如实时告警、离线分析、审计归档。
  • 方便后续扩展 Flink、ClickHouse、数据湖等链路。

但也要注意:日志链路越长,排查成本越高,需要配套监控 Kafka 堆积、Logstash 消费状态和 Elasticsearch 写入状态。

开启 kafka-logger 插件

可以在 Dashboard 中进入插件列表,找到 kafka-logger 并启用。

插件列表

启用 kafka-logger

示例配置:

{
  "broker_list": {
    "10.246.0.37": 9092,
    "10.246.0.38": 9092,
    "10.246.0.39": 9092
  },
  "kafka_topic": "apisix-logs",
  "batch_max_size": 10,
  "include_req_body": false,
  "include_resp_body": false
}

关键参数:

参数 说明
broker_list Kafka Broker 地址列表
kafka_topic 写入的 Kafka Topic
batch_max_size 批量发送日志的最大条数
include_req_body 是否采集请求体
include_resp_body 是否采集响应体

重要建议:生产环境不要默认开启 include_req_body 和 include_resp_body。请求体和响应体可能包含手机号、身份证、Token、密码、订单、支付等敏感信息,也会显著增加日志量。

Admin API 配置示例

可以将插件绑定到 Route:

curl -i "http://127.0.0.1:9180/apisix/admin/routes/log-demo" \
  -H "X-API-KEY: your-admin-key" \
  -X PUT \
  -d '{
    "uri": "/log-demo/*",
    "plugins": {
      "kafka-logger": {
        "broker_list": {
          "10.246.0.37": 9092,
          "10.246.0.38": 9092,
          "10.246.0.39": 9092
        },
        "kafka_topic": "apisix-logs",
        "batch_max_size": 10,
        "include_req_body": false,
        "include_resp_body": false
      }
    },
    "upstream": {
      "type": "roundrobin",
      "nodes": {
        "127.0.0.1:1980": 1
      }
    }
  }'

如果希望多个路由复用日志配置,可以考虑绑定到 Service 或使用全局规则,但要谨慎评估日志量。

Kafka Topic 规划

Topic 设计建议:

apisix-access-log
apisix-error-log
apisix-audit-log

也可以按环境区分:

dev-apisix-access-log
test-apisix-access-log
prod-apisix-access-log

生产建议:

  • 为日志 Topic 设置合理分区数。
  • 设置保留时间,避免 Kafka 磁盘被打满。
  • 监控 consumer lag。
  • 对重要日志链路配置副本数。

使用 Logstash 消费 Kafka

示例 logstash.conf:

input {
  kafka {
    bootstrap_servers => "10.246.0.37:9092,10.246.0.38:9092,10.246.0.39:9092"
    topics => ["apisix-logs"]
    client_id => "c_logstash_apisix"
    group_id => "g_logstash_apisix"
    auto_offset_reset => "latest"
    codec => "json"
  }
}

filter {
  mutate {
    add_field => { "log_source" => "apisix" }
  }
}

output {
  elasticsearch {
    hosts => ["http://10.246.0.100:9200"]
    index => "apisix-logs-%{+YYYY.MM.dd}"
  }
}

启动 Logstash:

bin/logstash -f logstash.conf

如果日志格式不是标准 JSON,需要在 filter 阶段增加解析逻辑。

在 Kibana 中检索

在 Kibana 中可以按下面步骤查看:

  1. 创建 Index Pattern / Data View,例如:apisix-logs-*。
  2. 选择时间字段。
  3. 在 Discover 中检索日志。
  4. 根据 URI、状态码、上游、客户端 IP、请求耗时等字段过滤。

常见检索方向:

  • 统计 5xx 错误。
  • 分析某个接口 P95 / P99 延迟。
  • 查看某个客户端 IP 请求量。
  • 排查某个时间段的异常请求。
  • 分析上游服务错误分布。

日志字段建议

APISIX 日志字段会随版本和插件配置变化,建议至少关注:

  • 请求时间。
  • Client IP。
  • Host。
  • URI。
  • Method。
  • Status。
  • Upstream 地址。
  • 请求耗时。
  • Upstream 耗时。
  • Request ID / Trace ID。
  • Consumer / Credential 信息。

如果系统已经接入链路追踪,建议在网关层透传 Trace ID,方便从 Kibana 跳转到链路追踪系统排查。

性能与安全注意事项

1. 请求体和响应体采集风险

默认不要采集 body。只有在明确需要排查问题时,才对特定路由临时开启,并设置脱敏策略。

风险包括:

  • 敏感信息泄露。
  • 日志量暴增。
  • Kafka 和 Elasticsearch 成本上升。
  • 大 body 影响网关性能。

2. 批量发送参数

kafka-logger 使用批处理机制。批量越大,吞吐越好,但日志延迟可能增加;批量越小,实时性更好,但发送压力更高。

建议通过压测和监控调整:

  • batch size。
  • flush interval。
  • Kafka topic 分区。
  • Logstash pipeline worker。

3. 失败处理

需要关注:

  • Kafka 不可用时 APISIX 插件行为。
  • 日志是否丢失。
  • 是否有重试和缓冲。
  • APISIX error.log 是否出现发送失败。

日志链路故障不应轻易影响核心业务请求,但也不能长期静默丢日志。

常见问题排查

1. Kafka 中没有日志

检查:

  • 插件是否绑定到正确 Route / Service。
  • 当前请求是否命中该路由。
  • Kafka broker 地址是否可达。
  • Topic 是否存在或允许自动创建。
  • APISIX error.log 是否有发送失败。

2. Logstash 消费不到数据

检查:

  • topics 是否正确。
  • group_id 是否重复导致消费位置不符合预期。
  • auto_offset_reset 设置。
  • Kafka consumer lag。
  • Logstash pipeline 是否启动成功。

3. Elasticsearch 没有索引

检查:

  • Logstash output 是否连接成功。
  • Elasticsearch 用户权限。
  • index 名称是否符合规范。
  • Kibana Data View 是否匹配。

总结

APISIX + Kafka + Logstash + Elasticsearch / Kibana 是一条常见的网关日志链路。设计时要重点关注:

  1. 日志采集范围。
  2. 是否采集请求体 / 响应体。
  3. Kafka Topic 和分区规划。
  4. Logstash 消费能力。
  5. Elasticsearch 索引生命周期。
  6. 敏感信息脱敏。
  7. 监控和告警。

日志链路不是“能写进去”就结束了,更重要的是可检索、可排查、可控成本和不泄露敏感数据。

参考资料

  • Apache APISIX kafka-logger 插件官方文档
  • Apache APISIX Batch Processor
  • Logstash Kafka input plugin
  • Elasticsearch 官方文档
指南
APISIX kafka-logger Kafka Logstash Elasticsearch Kibana 日志收集 可观测性
License:  CC BY 4.0
Share

Further Reading

Jun 27, 2026

Agent 架构设计原则:Router、Runtime 与 Business Script 的职责划分

本文整理一套适合 Router Agent + Skill + Runtime 架构的设计原则:Agent 只负责业务决策,Runtime 统一负责执行、恢复、Trace、Checkpoint 和 Evidence,Business Script 只做确定性业务执行。

Sep 9, 2024

Redis 核心概念、数据结构与高可用架构详解

系统梳理 Redis 的核心数据类型、底层结构、过期与淘汰、持久化、事务、主从复制、Sentinel、Cluster、缓存一致性和分布式锁等机制,适合作为 Redis 学习、面试复习和高可用架构设计参考。

Sep 5, 2024

B+树原理与 MySQL InnoDB 索引机制解析

本文从 B+ 树的多叉平衡结构、叶子节点链表、范围查询和磁盘 I/O 特性出发,解释数据库索引为什么常采用 B+ 树,并结合 MySQL InnoDB 的聚簇索引、二级索引、回表、覆盖索引和联合索引机制理解其实际应用。

OLDER

Linux 内核与网络参数调优:sysctl、文件描述符、TCP 队列与高并发配置

NEWER

APISIX proxy-mirror 流量镜像实践:灰度验证、监控分析与注意事项

Recently Updated

  • Agent 架构设计原则:Router、Runtime 与 Business Script 的职责划分
  • RocketMQ 架构设计与应用最佳实践:高可用消息队列核心解析
  • Redis 核心概念、数据结构与高可用架构详解
  • B+树原理与 MySQL InnoDB 索引机制解析
  • MySQL AUTO_INCREMENT 插入 0 变成自增值的原因与解决方案

Trending Tags

RocketMQ Windows Feign Docker Zipkin SonarQube OkHttp HttpClient API 性能优化

Contents

©2026 Ryan's Blog. Some rights reserved. · 粤ICP备2022031588号