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

配置集中式日志记录

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 使用以下配置项控制日志位置和错误日志详细程度:

conf/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

conf/config.yaml
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-loggerkafka-loggersyslogsplunk-hec-logginggoogle-cloud-loggingelasticsearch-loggerrocketmq-loggerclickhouse-logger 等日志插件,通过网络发送结构化请求日志,而不先将日志写入磁盘。完整的 Splunk HEC 流程请参阅将访问日志发送到 Splunk

在 Kubernetes 上,请参阅在 Kubernetes 上采集网关日志,以便在容器输出与 Pod 内文件之间做出选择,并配置 OpenTelemetry Collector 或 Filebeat。针对 Splunk 的错误日志流程请参阅将 Kubernetes 错误日志发送到 Splunk

后续步骤