在Nginx中过滤指定Request的access_log
in Linux with 1 comment

在Nginx中过滤指定Request的access_log

in Linux with 1 comment

在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_access_log_filter1

这些请求除了浪费空间几乎没有任何用处。所以我就尝试不让 Nginx 记录这一类的日志。

Solution

首先我尝试了:

location ~ .*tips$
{
    access_log off; 
}

但是日志还是照样产生,然后还有这样:

location ~ .*tips$
{
    access_log /dev/null;
}

我搜索了相关资料,貌似 Nginx 中的 Location 只支持匹配 URL 中的 pathinfofile ,不支持匹配 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;
}

问题完美解决。

Responses
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif
  1. 测试 icon_arrow.gif

    Reply