我正在尝试根据请求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
但是如果它是邪恶的,那么我不想使用它们。
答案 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%
}
虽然只是能够调整单个配置变量似乎需要做很多工作,但它实际上使得在长(和中)期间使用配置文件更加愉快,因为您将始终生成配置文件易于阅读和理解,而不是复杂的条件。