禁用nginx中的特定请求登录

时间:2013-07-02 10:25:32

标签: logging nginx

我正在尝试根据请求URI“忽略”或重定向nginx日志中的某些请求。

到目前为止,我有这个:

server {
  listen      80;
  #...
  access_log  /var/log/nginx/site.access;
  error_log   /var/log/nginx/site.error info;
  #...

  try_files $uri @app

  location = /lbcheck.html {
    access_log off;
    log_not_found off;
    try_files $uri @app;
  }

  location @app {
    proxy_redirect     off;
    proxy_pass http://unix:/tmp/site.unicorn.sock;
    #...
  }

}

基本上我希望代理的@app响应/lbcheck.html的请求,但我不希望它登录/var/log/nginx/site.access;

我知道我可以在if ($uri = /lbcheck.html) { access_log off; }中使用location @app但是如果它是邪恶的,那么我不想使用它们。

2 个答案:

答案 0 :(得分:14)

您可以使用conditional logging执行此操作。它看起来像

map $request $loggable {
    ~*lbcheck\.html 0;
    default 1;
}
access_log  /path/logs/name.log if=$loggable;

答案 1 :(得分:6)

我不确定是否有办法在Nginx的配置语法中进行,我只是尝试过,如果没有if语句,它似乎不可能。

但是我确实知道以你想要的方式做这件事是违反Nginx关于如何编写配置文件的哲学。

您应该使用您喜欢的任何配置工具生成nginx.conf文件,而不是编写复杂的配置规则,这样实际的配置文件很简单,工具为您生成了所有复杂的位。

e.g。生成nginx.conf的源文件应该类似于:

%START_APP_CONFIG%
    proxy_redirect     off;
    proxy_pass http://unix:/tmp/site.unicorn.sock;
%END_APP_CONFIG%


location = /lbcheck.html {
    access_log off;
    %INSERT_APP_CONFIG%
}

location @app {
    %INSERT_APP_CONFIG%
}

虽然只是能够调整单个配置变量似乎需要做很多工作,但它实际上使得在长(和中)期间使用配置文件更加愉快,因为您将始终生成配置文件易于阅读和理解,而不是复杂的条件。