从nginx 1.7版本开始,access_log日志文件中支持if语句判断。根据这个功能,我们可以根据status值分割nginx日志,正常200的访问记录放一个文件,404或者500等再放另外一个文件。对于后续分析nginx日志可能有用。
语法:
access_log path [format [buffer=size [flush=time]] [if=condition]]; The if parameter (1.7.0) enables conditional logging. A request will not be logged if the condition evaluates to “0” or an empty string
值是0时,access_log就不会记录日志。具体配置方法如下。
在nginx.conf代码块中添加如下内容:
map $status $normal { ~^2 1; default 0; } map $status $abnormal { ~^2 0; default 1; } map $remote_addr $islocal { ~^127 1; default 0; }
这个配置的意思大概是status值2开头的都正常,其他都是不正常访问。如果remote_addr是127,那么说明是本地内部调用。
定义好判断值后,在具体server代码块中添加类似如下:
server { access_log logs/access.log combined if=$normal; access_log logs/access_abnormal.log combined if=$abnormal; access_log logs/access_local.log combined if=$islocal; }
添加后reload重新载入nginx,可以看到nginx日志已经根据Status返回值正常分割。
如果nginx版本不对,请先升级nginx,具体升级方法可以参考这篇文章。