因?yàn)榧瘓F(tuán)的SLB經(jīng)常會(huì)通過心跳來進(jìn)行服務(wù)檢測(cè), 每秒會(huì)有多個(gè)access, 導(dǎo)致日志文件經(jīng)常將磁盤過度占用, 觸發(fā)告警. 所以配置規(guī)則, 對(duì)access_log進(jìn)行過濾.
搜索了網(wǎng)上很多朋友的,但是發(fā)現(xiàn)不好使, 最后自己摸索出來了. 特地寫出來,希望對(duì)以后的同學(xué)有幫助.
注意: 需要nginx版本大于等于 1.7.0
首先官方文檔中,給出了一種寫法.
# 按請(qǐng)求狀態(tài)過濾,如果是 2xx 3xx 4xx ,則不記錄
map $status $loggable{
default 1;
~^[234] 0;
}
對(duì)規(guī)則進(jìn)行說明: map 指令將 $status
映射到了 $loggable
, 并在內(nèi)部指明了規(guī)則:
模式是 1 (true)
如果是匹配了正則表達(dá)式, 也就是說 返回狀態(tài)是 2xx 3xx 4xx的, 就不記錄.
通過下面的配置, 即可啟用acess_log并啟用我們的規(guī)則
access_log logs/custom_log.log mylogformat if=$loggable;
其中, mylogformat
是我定義的一段日志格式. 這個(gè)稍后給出.
但是, 對(duì)于我自己來說, 僅僅通過狀態(tài)碼是不夠的, 因?yàn)槲抑皇窍肫帘蝸碜許LB的訪問.并且不關(guān)心它的狀態(tài).
所以,配置了另外一個(gè)map
}
# 按IP正則過濾
map $remote_addr $iploggable{
default 1;
~^10.237.223.1(\d+) 0;
}
這樣, 即可過濾來自 10.237.223.1xx的access log了.
那么這個(gè)可映射的東西有哪些?
我猜想能出現(xiàn)在format中的應(yīng)該都沒問題, 但是僅僅測(cè)試了兩個(gè), 有興趣的朋友可以嘗試并反饋哈.
完整代碼:
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"';
# 按請(qǐng)求狀態(tài)過濾,如果是 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{}內(nèi), server{}外.