API网关Kong实践笔记

Kong日志向导

2019-10-03  本文已影响0人  fossilman

日志等级

日志级别可以在Kong配置文件中设置,以下是日志级别的严重程度,按递增排序:debuginfonoticewarnerrorcrit

从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 中的正则表达式语法,这个例子中我们会查找三个内容:

现在我们需要设置日志格式,我们使用 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 命令
现在,日志不会记录与电子邮件地址相关的任何请求,我们也可以用类似的逻辑从日志中删除任何我们不想要的内容

上一篇下一篇

猜你喜欢

热点阅读