跳到主要内容
版本:3.9.x

在访问日志中记录消费者标签

在 API 网关的访问日志中记录消费者标签,可以提高对 API 流量的可见性和控制力。通过捕获消费者标签,企业可以轻松识别哪些客户端正在访问特定路由,追踪使用模式,并根据这些标签执行安全策略。

本指南将引导你了解如何在网关的访问日志中记录消费者标签。

前提条件

  1. 安装 API7 企业版
  2. 在网关组上有一个正在运行的 API

在访问日志中创建并使用新变量

在网关的配置文件中,为消费者标签初始化一个自定义变量并为其分配默认值 -。在这个例子中,你将初始化一个名为 $consumer_company 的变量,但你始终可以根据需要初始化更多变量:

conf/config.yaml
nginx_config:
http_server_location_configuration_snippet: |
set $consumer_company "-";

在同一个文件中,更新访问日志格式以包含新初始化的变量:

conf/config.yaml
nginx_config:
http:
access_log_format: >-
$remote_addr - $remote_user [$time_local] $http_host \"$request\" $status $body_bytes_sent $request_time \"$http_referer\" \"$http_user_agent\" $upstream_addr $upstream_status $upstream_response_time \"$upstream_scheme://$upstream_host$upstream_uri\" "$consumer_company"

重新加载网关以使更改生效。

为新变量赋值

使用无服务器函数 (Serverless Functions) 为新变量分配消费者标签值。

例如,将 serverless-pre-function 插件配置为具有以下配置的全局插件:

{
"phase": "rewrite",
"functions": [
"return function (conf, ctx) ngx.var.consumer_company = ctx.consumer and ctx.consumer.labels and ctx.consumer.labels[\"company\"] or \"unknown\" end"
]
}

该函数获取消费者标签 company 的值,并将其赋给 consumer_company 变量。如果消费者没有 company 标签,那么 consumer_company 变量的值将被赋予 unknown

配置消费者和身份验证

创建一个消费者,名为 john,带有标签 company: smart-technology,并为该消费者配置密钥身份验证凭证为 john-key

接下来,创建一个路由并启用 Key Authentication 身份验证

验证

使用有效的密钥向路由发送请求:

curl -i "http://127.0.0.1:9080/anything" -H 'apikey: john-key'

你应该会收到 HTTP/1.1 200 OK 响应,并在访问日志中看到以下内容,其中公司名称被记录为 smart-technology

192.168.107.1 - - [18/Mar/2025:09:17:28 +0000] 127.0.0.1:9080 "GET /anything HTTP/1.1" 200 508 1.260 "-" "curl/8.6.0" 13.210.43.76:80 200 1.153 "http://127.0.0.1:9080" "smart-technology"

不带密钥向路由发送请求:

curl -i "http://127.0.0.1:9080/anything"

你应该会看到 HTTP/1.1 401 Unauthorized 响应,并在访问日志中看到以下内容,其中公司名称被记录为 unknown

192.168.107.1 - - [18/Mar/2025:09:18:27 +0000] 127.0.0.1:9080 "GET /anything HTTP/1.1" 401 52 0.000 "-" "curl/8.6.0" - - - "http://127.0.0.1:9080" "unknown"