Kong日志向导
日志等级
日志级别可以在Kong配置文件中设置,以下是日志级别的严重程度,按递增排序:debug
、info
、notice
、warn
、error
和 crit
-
debug
:提供了每个插件以及其他组件的调试信息,只在调试期间使用,内容过于繁琐 -
info/notice
:这两个级别的日志没有太大差别,提供了正常行为的信息,大部分可以忽略 -
warn
:记录异常,但是不会导致事务失败的行为 -
error
:记录导致请求错误的日志(比如获得了一个500报错) -
crit
:Kong处于致命错误从而影响到多个客户端,Nginx还提供了alert
和emerg
的日志级别,Kong现在将crit
定为最高日志级别
默认情况下,日志级别为notice
,这也是推荐的日志级别,如果觉得日志内容过于繁琐,可以提高日志级别
从Kong日志中删除指定字段
由于保护私人数据(如GDPR等)新规定的出台,用户可能需要更改记录日志的习惯,如果选用Kong作为API网关,只需在一个地方做出修改,所有的服务都会生效,这篇向导会介绍实现此目标的一个方法,另外还有其他方法可以满足其他各种需求,请注意,这些更改只会影响 Nginx 的 access log 的输出,对Kong的日志插件没有任何影响
举个例子,假设用户需要从日志中删除任何关于电子邮件地址的示例,电子邮件可能会以各种形式出现,比如 /servicename/v2/verify/alice@example.com
或者 /v3/verify?alice@example.com
,为了防止这些被添加到日志中,用户需要自定义 Nginx 模板
用户可以先从这个地址获取Nginx的模板文件:https://docs.konghq.com/latest/configuration/#custom-nginx-templates-embedding-kong,或者复制下面的文件
# ---------------------
# custom_nginx.template
# ---------------------
worker_processes $; # can be set by kong.conf
daemon $; # can be set by kong.conf
pid pids/nginx.pid; # this setting is mandatory
error_log logs/error.log $; # can be set by kong.conf
events {
use epoll; # custom setting
multi_accept on;
}
http {
# include default Kong Nginx config
include 'nginx-kong.conf';
# custom server
server {
listen 8888;
server_name custom_server;
location / {
... # etc
}
}
}
为了控制日志中的内容,我们需要在模板文件中使用 Nginx 的 map 模块,关于 map 模块的详细信息可以参考 https://nginx.org/en/docs/http/ngx_http_map_module.html,用户需要创建一个新的变量,变量的内容取决于第一个参数加上匹配的规则,格式如下:
map $paramater_to_look_at $variable_name {
pattern_to_look_for 0;
second_pattern_to_look_for 0;
default 1;
}
在这个例子中,我们创建一个新的变量 keeplog
,这个变量依赖于 $request_uri
,我们将 map 指令放在 http 块的开头位置,这句话必须在 include 'nginx-kong.conf';
这句话之前,示例中我们可以这么添加:
map $request_uri $keeplog {
~.+\@.+\..+ 0;
~/servicename/v2/verify 0;
~/v3/verify 0;
default 1;
}
用户可能注意到配置文件中的每一行都是以~符号开头的,这是 Nginx 中的正则表达式语法,这个例子中我们会查找三个内容:
- 第一行是查找 x@y.z 格式的电子邮件地址
- 第二行是查找包含 /servicename/v2/verify 的URI地址
- 第三行是查找包含 /v3/verify 的URI地址
现在我们需要设置日志格式,我们使用 log_format
模块,并将日志格式新命名为 show_everything,日志的内容可以根据用户需要进行定制,这个例子中,我们将内容改回Kong的标准格式
log_format show_everything '$remote_addr - $remote_user [$time_local] '
'$request_uri $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
现在我们自定义的 Nginx 模板可以使用了,文件如下所示:
# ---------------------
# custom_nginx.template
# ---------------------
worker_processes $; # can be set by kong.conf
daemon $; # can be set by kong.conf
pid pids/nginx.pid; # this setting is mandatory
error_log stderr $; # can be set by kong.conf
events {
use epoll; # custom setting
multi_accept on;
}
http {
map $request_uri $keeplog {
~.+\@.+\..+ 0;
~/v1/invitation/ 0;
~/reset/v1/customer/password/token 0;
~/v2/verify 0;
default 1;
}
log_format show_everything '$remote_addr - $remote_user [$time_local] '
'$request_uri $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
include 'nginx-kong.conf';
}
下一步我们需要告诉Kong使用新创建的日志 show_everything
,为此,我们需要修改变量 proxy_access_log
,此时可以编辑 etc/kong/kong.conf
配置文件,也可以直接修改环境变量 KONG_PROXY_ACCESS_LOG
proxy_access_log=logs/access.log show_everything if=$keeplog
最后一步重启Kong,使所有更改生效,用户可以使用 kong restart
命令
现在,日志不会记录与电子邮件地址相关的任何请求,我们也可以用类似的逻辑从日志中删除任何我们不想要的内容