我想记录$request
,但想过滤出密码或密钥等敏感信息。
我尝试了以下操作但它不起作用:
http {
log_format xxx '$filtered_request';
location /xxx {
set $filtered_request $request;
if ($filtered_request ~ (.*)password=[^&]*(.*)) {
set $filtered_request $1password=****$2;
}
access_log /var/log/xxx.log xxx;
}
}
这会将空行保存到日志文件中。
事实上,以下情况也不起作用:
http {
log_format yyy '$yyy';
location /foo {
set $yyy 'abc';
access_log /var/log/yyy.log yyy;
}
}
结果仍是空行。
如何在log_format
中使用自定义变量?
我正在使用nginx / 1.2.5
更新:我注意到set $yyy 'abc';
实际上有所作为,但该值未反映在日志中。即:
http {
log_format yyy '$request $arg_password';
location /foo {
set $arg_password 'filtered';
access_log /var/log/yyy.log yyy;
}
}
$arg_password
使用set ...
语句变为空,如果?password=asdf
语句被注释掉,则将asdf
记录为set ...
。
答案 0 :(得分:0)
事实证明在那个位置有一些重写:
location /foo {
...
rewrite ^(/foo)... ... break;
set $filtered_request $request;
...
}
如果我在重写之前移动set
语句,它可以正常工作:
location /foo {
...
set $filtered_request $request;
...
rewrite ^(/foo)... ... break;
...
}
不知道为什么它有使变量变空的副作用。 但至少手头的问题已经解决了。