探秘 APISIX 的 http-logger 插件:轻松收集 API 调用日志

更新时间 4/11/2024

引言

在现代软件开发的过程中,API 调用日志是不可缺少的一部分,它记录了应用程序的每个 API 调用的详细信息,通过有效的日志管理,开发团队可以实时监控 API 的调用情况,及时发现和解决问题。企业中通常都有很成熟的日志系统解决方案,但是开发人员可能会面临权限限制、审批流程的问题,使他们难以将处在早期的测试服务日志集成到企业内部的日志系统中去,从而影响他们的开发效率。

Apache APISIX 提供的 http-logger 插件支持我们对接 HTTP 服务器,它使用最通用的 HTTP 协议接收日志,使开发人员能够轻松直接地查看 API 调用日志,从而提高开发效率。下面我们将介绍它的工作原理,以及应该如何使用它。

Http-logger 插件原理

APISIX 的 http-logger 插件支持将日志数据推送到 HTTP 或者 HTTPS 服务器,它的主要运行原理是当客户端发起请求时,APISIX 处理请求并生成访问日志,在请求结束后 http-logger 插件以异步的方式将请求的上下文信息按照指定的日志格式组合后,通过 POST 请求将日志数据作为 JSON 对象放到请求体中发送给我们配置的接收日志的 HTTP 或者 HTTPS 服务器。这样我们就可以在自己的 HTTP 或者 HTTPS 服务上看到 API 的日志信息,极大提升开发阶段的效率。

为了方便大家更好理解它的工作原理,下面我们用一张流程图来展示数据的流向。

Data flow diagram

创建一个简单的 HTTP 服务接收日志

尽管目前市场上已经存在许多 SaaS 产品和开源的解决方案,如比较常见的 Loggly、Splunk 和 ELK Stack 等来管理和分析日志,但是在企业内部,甚至很多企业因为严格的安全要求网络是隔离的,没办法访问外部网络,而且在开发测试阶段,我们的首要目的是能方便地查看 API 调用日志,方便开发过程中的故障排查和问题定位。因此我们可以快速编写一个简单的 HTTP 服务来收集日志,这里以 Node.js 为例:

1// httpserver.js
2const http = require('http');
3
4http.createServer((req, res) => {
5    let data = '';
6    req.on('data', chunk => {
7        data += chunk;
8    });
9    req.on('end', () => {
10        console.log('APISIX Log:', data);
11    });
12
13    res.writeHead(200, {'Content-Type': 'text/plain'});
14    res.end(`Hello World\n`);
15}).listen(3000, () => {
16    console.log('Server running at http://localhost:3000/');
17});

上面的脚本主要是监听本地的 3000 端口,并且将请求此服务端点的请求体打印出来。你可以按照此步骤运行并测试它:

  1. 运行 node httpserver.js 启动此服务;

  2. 使用 curl -i http://127.0.0.1:3000/ -d '{"name": "Jack"}' 命令访问次端点;

  3. 你应该看到类似的输出:

1Server running at http://localhost:3000/
2APISIX Log: {"name": "Jack"}

在 APISIX 中启用 http-logger 插件

下面我们来介绍如何在 APISIX 中启用 http-logger 插件,并将日志发送到我们上一步创建的 HTTP 服务上。

  1. 使用 APISIX 提供的 Admin API 创建路由,并启用 http-logger 插件:
1curl "http://127.0.0.1:9080/apisix/admin/routes/1" \
2-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
3    {
4      "uri": "/get",
5      "upstream": {
6        "type": "roundrobin",
7        "nodes": {
8          "httpbin.org:80": 1
9        }
10      },
11      "plugins": {
12              "http-logger": {
13                  "uri": "http://127.0.0.1:3000/"
14              }
15        }
16    }'
  1. 使用 curl 命令给 APISIX 发送请求:curl -i http://127.0.0.1:9080/get

  2. 接着你可以在终端看到类似的日志输出:

Log output for enabling http-logger plugin

可以看到,我们已经成功采集到 APISIX 发送过来的日志信息。

自定义日志格式

http-logger 插件允许开发者自定义日志的格式,以满足不同场景的需求。如果你只关心日志数据中的部分字段,APISIX 同样支持声明日志格式和内容,我们可以通过设置 APISIX 提供的插件元数据来自定义日志格式。

1. 通过 Admin API 配置插件元数据

1curl http://127.0.0.1:9180/apisix/admin/plugin_metadata/http-logger \
2-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
3{
4    "log_format": {
5        "host": "$host",
6        "@timestamp": "$time_iso8601",
7        "client_ip": "$remote_addr"
8    }
9}'

2. 再次通过 curl 命令请求,你应该看到类似的日志输出:

1APISIX Log: [{"service_id":"a869a037-27df-4278-ab50-4e66d212cfc0","client_ip":"192.168.65.1","host":"127.0.0.1","route_id":"4f499953-9504-4737-9f3d-facaeda4b841","@timestamp":"2024-04-10T00:10:31+00:00"}]

总结

通过使用 http-logger 插件,不仅帮助开发人员简化了日志查看流程,也提高了日常开发效率。http-logger 插件是 APISIX 提供的一种最简单、易用的日志插件,它不需要与某种日志协议绑定,使用了最通用的 HTTP 协议进行网络传输,方便开发者对接任意的 HTTP 服务,灵活的选择接收日志的服务。

此外,APISIX 还支持了十几种日志插件,以满足不同场景下的需求。无论是简单的 HTTP 日志收集还是更复杂的日志分析与监控,或者是极高的性能要求和稳定性,APISIX 都能够提供全方位的支持,为用户创造出更加便捷、高效的系统。

微信咨询

获取方案