Nginx access_log日志条件过滤(IP地址/请求状态)

因为集团的SLB经常会通过心跳来进行服务检测, 每秒会有多个access, 导致日志文件经常将磁盘过度占用, 触发告警. 所以配置规则, 对access_log进行过滤.

搜索了网上很多朋友的,但是发现不好使, 最后自己摸索出来了. 特地写出来,希望对以后的同学有帮助.
注意: 需要nginx版本大于等于 1.7.0

首先官方文档中,给出了一种写法.

 # 按请求状态过滤,如果是 2xx 3xx 4xx ,则不记录
    map $status $loggable{
        default 1;
        ~^[234] 0;
    }

对规则进行说明: map 指令将 $status 映射到了 $loggable, 并在内部指明了规则:
模式是 1 (true)
如果是匹配了正则表达式, 也就是说 返回状态是 2xx 3xx 4xx的, 就不记录.
通过下面的配置, 即可启用acess_log并启用我们的规则

access_log logs/custom_log.log mylogformat if=$loggable;

其中, mylogformat是我定义的一段日志格式. 这个稍后给出.

但是, 对于我自己来说, 仅仅通过状态码是不够的, 因为我只是想屏蔽来自SLB的访问.并且不关心它的状态.
所以,配置了另外一个map

 }
    # 按IP正则过滤
    map $remote_addr $iploggable{
        default 1;
        ~^10.237.223.1(\d+) 0;
    }

这样, 即可过滤来自 10.237.223.1xx的access log了.
那么这个可映射的东西有哪些?
我猜想能出现在format中的应该都没问题, 但是仅仅测试了两个, 有兴趣的朋友可以尝试并反馈哈.

完整代码:


 
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    log_format  mylogformat '"$remote_addr" "[$time_local]" "$request_method" '
                      '"$uri" "$request_uri" "$request_time" "$status" "$body_bytes_sent"'
                       '"$http_referer" "$http_x_forwarded_for" "$http_user_agent" "$upstream_status"'
                      '"$upstream_addr" "$upstream_response_time"';
    # 按请求状态过滤,如果是 2xx 3xx 4xx ,则不记录
    map $status $loggable{
        default 1;
        ~^[234] 0;
    }
    # 按IP正则过滤
    map $remote_addr $iploggable{
        default 1;
        ~^10.237.223.1(\d+) 0;
    }
    access_log logs/custom_log.log mylogformat if=$iploggable;
    server {

以上代码放到 http{}内, server{}外.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。