## 配置指令 1、在kong.conf中增加如下配置: ``` nginx_http_log_format=main '$remote_addr $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" $http_user_agent $http_x_forwarded_for $request_time $upstream_response_time $upstream_addr $upstream_status' ``` 2、在kong.conf中修改proxy_access_log为: ``` proxy_access_log = logs/access.log main ``` 3、最终配置结果为: ![](https://img.kancloud.cn/8f/71/8f718afe5abb9a48d01286a23f23cb30_1295x317.png) 4、重启kong后,查看nginx-kong.conf文件,会看到注入指令相关信息: ![](https://img.kancloud.cn/2f/5a/2f5aed3ebd37cf50aec1f9a29ba1fdbd_1291x498.png) server 模块中: ![](https://img.kancloud.cn/e4/2c/e42c488544358e84703f499fb026f975_712x326.png) ## 结果验证 ``` 192.168.66.144 - [14/Jan/2021:17:49:27 +0800] "GET /request HTTP/1.1" 401 26 "-" curl/7.29.0 - 0.003 - - - 192.168.66.144 - [14/Jan/2021:17:49:32 +0800] "GET /request HTTP/1.1" 401 26 "-" curl/7.29.0 - 0.003 - - - ``` 对比一下是否和上面配置的format是一致的呢?一致说明配置生效了。日志中的`-`其实对应的是没有数据,所以最后连续的三个`-`对应`$upstream_response_time $upstream_addr $upstream_status`,这三个变量没有值,为什么? 因为format格式中使用的变量其实是nginx http,upstream,log等模块提供的,具体有什么变量可用,可查阅[官方文档](http://nginx.org/en/docs/http/ngx_http_core_module.html)。由于我这里使用Kong作为一个简单的请求代理,并未使用upstream模块来做对上游服务的度负载均衡,所以所有`$upstream`开头的变量是没有值的。 基于此应当明白,这样的配置日志格式,仅仅是使用了nginx提供的功能,这里的配置与使用Kong的日志插件没有关系。此种方式也并不能使用openresty和kong提供的变量,比如获取请求处理过程中的延迟情况。所以这种方式的日志能提供的信息很少,**要想获取更加全面的日志信息,应当使用日志插件**。 ## 自定义变量 前面提到,nginx内置变量固定,log中只能记录nginx变量,但是我们可以自定义变量,在请求处理过程中写入值,然后配置log\_format输出。假设我现在想要记录token里的clientid,应该怎么做呢? 1. 使用set指令自定义一个变量client\_id,默认值为空字符,即在kong.conf文件中增加如下配置:`nginx_proxy_set=$client_id ''` 2. 在jwt插件中解析token后,取到clientid的值并写入变量:`ngx.var.client_id = kong.ctx.plugin.client_id` 3. 修改log\_format :`nginx_http_log_format=main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_time "$http_authorization" "$client_id" '`