配置集中式日志记录
API7 网关会生成多种日志,用于调试和运维。生产环境建议将日志转发到 Elasticsearch、Splunk 或 AWS CloudWatch 等集中式日志管理系统。
日志类型和位置
数据面日志
数据面会产生错误日志和访问日志。默认配置使用相对于网关安装前缀的路径:
| 日志类型 | 说明 | 默认目标 |
|---|---|---|
| 错误日志 | 网关启动事件、插件错误、上游故障和核心错误。 | logs/error.log |
| 访问日志 | 网关处理的每个请求一行。 | logs/access.log |
在非容器部署中,这些目标就是安装前缀下的普通文件。而在官方容器镜像中,解析后的路 径 /usr/local/apisix/logs/error.log 和 /usr/local/apisix/logs/access.log 是指向 /dev/stderr 和 /dev/stdout 的符号链接,网关 Helm Chart 也直接写入这两个设备路径。因此默认的容器部署没有可供读取的普通访问日志和错误日志文件,应改为采集容器输出。
两个目标都可以配置,请参阅下文的配置日志文件,以及在 Kubernetes 上采集网关日志了解 Kubernetes 上对卷、轮转和采集器的要求。
控制面日志
控制面(控制台和 DP Manager)会将结构化日志输出到对应容器的标准输出:
docker logs <api7-ee-dashboard-container>
docker logs <api7-ee-dp-manager-container>
配置创建、更新、删除、登录和角色变更等管理操作会单独记录在审计日志中,并可在控制台查看。
配置日志文件
数据面的 config.yaml 使用以下配置项控制日志位置和错误日志详细程度:
nginx_config:
error_log: logs/error.log
error_log_level: warn # debug, info, notice, warn, error, crit, alert, emerg
http:
enable_access_log: true
access_log: logs/access.log
access_log_format: '$remote_addr - $remote_user [$time_local] $http_host "$request_line" $status $body_bytes_sent $request_time "$http_referer" "$http_user_agent" $upstream_addr $upstream_status $upstream_response_time "$apisix_request_id"'
access_log_format_escape: default # default or json
上例展示的是默认目标。相对路径以网关安装前缀为基准解析。若要在官方容器镜像中写入普通文件,请选择 /usr/local/apisix/logs/ 以外的路径, 例如 /var/log/apisix/access.log 和 /var/log/apisix/error.log;启动网关前需要先创建该目录、授予网关进程写权限,并在该路径挂载卷。
修改后请重新加载或重启网关。
使用 JSON 访问日志格式
为了便于日志采集器解析,可以使用 JSON 格式并将转义方式设为 json:
nginx_config:
http:
access_log_format: '{"time_local":"$time_local","remote_addr":"$remote_addr","status":"$status","request_time":"$request_time","upstream_status":"$upstream_status","request":"$request"}'
access_log_format_escape: json
如需在每行访问日志中包含消费者标签,请参阅在访问日志中包含消费者标签。
将日志转发到集中式系统
有两种互补方式:
- 采集容器输出,或发送已配置的日志文件:在容器部署中,除非显式配置了普通文件,否则应采集标准输出和标准错误。若使用文件输出,则运行 Fluentd、Vector、Filebeat 或 Logstash 等日志转发器读取所配置的路径,例如
/var/log/apisix/access.log和/var/log/apisix/error.log。此方式适用于任意后端,并将日志投递与请求处理路径解耦。 - 从路由直接发送日志:使用
http-logger、kafka-logger、syslog、splunk-hec-logging、google-cloud-logging、elasticsearch-logger、rocketmq-logger或clickhouse-logger等日志插件,通过网络发送结构化请求日志,而不先将日志写入磁盘。完整的 Splunk HEC 流程请参阅将访问日志发送到 Splunk。
在 Kubernetes 上,请参阅在 Kubernetes 上采集网关日志,以便在容器输出与 Pod 内文件之间做出选择,并配置 OpenTelemetry Collector 或 Filebeat。针对 Splunk 的错误日志流程请参阅将 Kubernetes 错误日志发送到 Splunk。
后续步骤
- 在访问日志中包含消费者标签:在每行访问日志中包含消费者级元数据。
- 在 Kubernetes 上采集网关日志:使用 OpenTelemetry Collector 或 Filebeat 采集容器输出或 Pod 内的文件。
- 将访问日志发送到 Splunk:通过 HTTP 将日志传输到 Splunk。
- 将 Kubernetes 错误日志发送到 Splunk:使用 Splunk OpenTelemetry Collector 收集 Kubernetes 网关错误日志。
- 配置告警:在错误率超过阈值时接收通知。
- 审计日 志:跟踪通过控制台或 Admin API 进行的配置更改。