因为集团的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{}外.