日志

Nginx通过ngx_log_if模块实现日志过滤

有时候我们需要对服务器的access日志进行自定义过滤,例如不想记录任何404的访问日志等.在Apache下我们可以通过CustomLog [env=XXX]来实现,但Nginx自身并不提供类似的功能,不过从官方的第三方模块中我们可以找到 ngx_log_if 这个非常好用的扩展模块来实现同样的功能.

  • 重编译Nginx安装第三方模块

首先你需要知道你的Nginx版本
$ nginx -v

nginx version: nginx/1.6.3

Nginx历史版本下载 点击这里

从GIT下载 ngx_log_if 模块

$  git clone https://github.com/cfsego/ngx_log_if.git
Nginx编译
# 假设你的nginx安装在/etc/nginx , ngx_log_if 在/usr/lib/ngx_log_if 目录

# 解压nginx后开始重编译

$ ./configure --prefix=/etc/nginx --add-module=/usr/lib/ngx_log_if + ...你的原编译配置

$ make

注意:在configure参数中务必把原来的编译配置补全,通过下面的命令可以知道你原来的配置

$ nginx -V

编译结束后会生成一个新的nginx,先关闭旧的nginx,然后替换新编译的nginx(假设位于/usr/sbin/nginx),重启nginx即可

$ sudo nginx -s stop

# nginx路径按需要修改

$ sudo cp objs/nginx  /usr/sbin/nginx

$ sudo nginx

至此ngx_log_if模块安装完毕

  • 通过ngx_log_if进行Access日志过滤

server {
    # 不记录400响应状态的access日志
    access_log_bypass_if ($status = 400);
   
    # 不记录200响应状态且uri为 status.nginx 的访问日志
    access_log_bypass_if ($uri = 'status.nginx') and;
    access_log_bypass_if ($status = 200);
}

子配置会默认覆盖父配置

server {
    # 父配置 , 无效
    access_log_bypass_if ($status = 400);

    location / {
        # 子配置 , 有效
        access_log_bypass_if ($host ~* 'nolog.com');
    }
}
转载请注明出处:

© http://hejunhao.me