在Nginx中过滤指定Request的access_log
Quotes
Nginx Documentation
Nginx - Module ngx_http_log_module
SegmentFault 中相关问题的解答
Problem
问题是今天检查公司线上项目的 access_log
时发现的。
首先 Nginx 的配置部分如下:
server
{
listen 80;
....................
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$
{
expires 12h;
access_log off;
}
access_log /var/log/xxx.log;
}
如上配置,将请求中图片、样式、JS 等静态资源缓存并不记录 access_log
。
但是我们的项目中有异步的定时请求相关的功能,只要页面存在,每 3 秒请求一次。打开日志文件出现了大量无用的访问日志,如下:
这些请求除了浪费空间几乎没有任何用处。所以我就尝试不让 Nginx 记录这一类的日志。
Solution
首先我尝试了:
location ~ .*tips$
{
access_log off;
}
但是日志还是照样产生,然后还有这样:
location ~ .*tips$
{
access_log /dev/null;
}
我搜索了相关资料,貌似 Nginx
中的 Location
只支持匹配 URL 中的 pathinfo
和 file
,不支持匹配 query_string
。所以,经过 N 多蛋疼的尝试后,终于在 SegmentFault 中找到了这篇文章:如何在 nginx 中忽略某些 php 动态请求的 log。
虽然这位题主的问题和我遇到的有一些不同,但是下面的回答完美的解决了我的问题。
附上原答案:
我还没有实验 不过你可以把
location ^~ /index.php/test 修改成
location ~ /index.php/test
因为location如果匹配^~ 只会执行当前location区域 不会再执行其它了一个hack的办法 哈哈 应该是满足你的需求了
server { listen 80; server_name www.test.com; index index.php; root /data0/www/web/; set $logfile /var/log/test_access.log ; if ($request_uri ~ ^/index.php/test){ set $logfile /dev/null ; } location ~ .*\.php(\/.*)*$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 10d; } error_log /var/log/test_err.log; access_log /$logfile; }
因为location肯定会停止的 所以能够匹配的只有if语句 但是access_log不能放在if语句里面 所以可以用设置变量的方法将access_log日志存放的位置发生变化 如果是test就存放到/dev/null 如果需要的就存放到正常的日志里面 就可以了。
我的经过修改后的配置:
server
{
listen 80;
....................
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$
{
expires 12h;
access_log off;
}
set $logfile /var/log/xxx.log ;
if ($request_uri ~ .*tips$){
set $logfile /dev/null ;
}
access_log /$logfile;
}
问题完美解决。
本文由 root 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Mar 23, 2018 at 03:12 pm
测试