过滤掉nginx log_format中的信息

时间:2018-03-06 20:23:47

标签: nginx nginx-location nginx-log

我想记录$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 ...

1 个答案:

答案 0 :(得分:0)

事实证明在那个位置有一些重写:

location /foo {
  ...
  rewrite ^(/foo)... ... break;

  set $filtered_request $request;
  ...
}

如果我在重写之前移动set语句,它可以正常工作:

location /foo {
  ...

  set $filtered_request $request;
  ...

  rewrite ^(/foo)... ... break;

  ...
}

不知道为什么它有使变量变空的副作用。 但至少手头的问题已经解决了。