日志等級
日志級別可以在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
命令
現在,日志不會記錄與電子郵件地址相關的任何請求,我們也可以用類似的邏輯從日志中刪除任何我們不想要的內容