公司有若干的nginx日志,打算用elastic search实现对实践间隔nginx请求量的统计,实现对各种常用指标的检索。
大坑1:
有三台同配置的es,但总有一台异常退出。经过对该服务器的内存使用情况进行分析,发现,是有进程占用内存,导致es的内存OOM。
大坑2:
es需要用logstash读取nginx日志进行解析,但如何书写规则,特别是自定义的nginx日志规则。
建议用如下网站进行日志的匹配规则编写。
http://grokdebug.herokuapp.com/
我根据我们日志编写了如下规则,可以参考。
input {
filter {
grok {
match =>{"message" =>"\"%{IP:remote_addr}\" \"%{IPORHOST:upstream_addr}:%{POSINT:port}\" \"\[%{HTTPDATE:time_local}\]\" \
"%{BASE16FLOAT:request_time}\" \"%{BASE16FLOAT:upstream_response_time}\" \"%{INT:status}\" \"%{WORD:sent_http_ufactrl_response_code}\
" \"%{INT:request_length}\" \"%{INT:bytes_sent}\" \"%{NOTSPACE:sent_http_ufactrl_subapp_code}\" \"%{WORD:verb} %{URIPATHPARAM:request
} HTTP/%{NUMBER:httpversion}\" \"%{DATA:http_user_agent}\""}
}
#mutate {
# split => { "message" => "\" " }
#}
date {
match => [ "time_local" , "dd/MMM/yyyy:HH:mm:ss Z" , "yyyy-MMM-dd HH:mm:ss" ]
}
geoip {
source => "remote_addr"
}
kv {
source => "request"
field_split => "&?"
value_split => "="
}
urldecode {
all_fields => true
}
}
output {
elasticsearch {
hosts => '10.0.3.99'
index =>"%{type}-nginx-%{+YYYY.MM.dd}"
document_type => "nginx"
# document_type => "%{type}"
template_overwrite => true
}
# stdout {
# codec => rubydebug
# }
}
大坑3:
如果直接用logstash进行日志收集,那节点服务器的内存会占用很多。所以,我们使用n个logstash foward 汇集日志到logsgtash节点。当然,kafka更好。
es里如下配置:
lumberjack {
# The port to listen on
port => 13810
# The paths to your ssl cert and key
ssl_certificate => "/home/ke/logstash-2.1.0/bin/lumberjack.crt"
ssl_key => "/home/ke/logstash-2.1.0/bin/lumberjack.key"
# Set this to whatever you want.
type => "somelogs"
}
}
大坑4.kabian的大坑。
每次都下意识想把日志时间字段转化为timestap.其实不用这样。直接拿来日期,用kabian直接显示即可。