nginx的access日志,logstash在配ngrok的时候,最初用的是COMBINEDAPACHELOG,听说是写好的匹配nginx日志,就打算拿来直接用。
把logstash跑起来就发现,字段都没进es里去,message却是有的,仔细看tag标签有个提示:_grokparsefailure。哦,原来ngrok报错了。
想想也是。elastic家也没有责任必须匹配nginx那么准确,nginx升个级什么的,COMBINEDAPACHELOG也不能保证更新。
其实nginx默认的log_format还不含请求时间、请求域名。想弄完整的还是得自己写。
nginx那边好配,关键是logstash的grok的match参数,要跟nginx的log_format匹配上。
网上的match参数一大堆,但是不管用哪个,除非运气极好一次跑成功,否则必须用grok debugger测试。
注意点:
1.空格(最难发现的)2.双引号(别忘了转义)3.类型要匹配
示范(可直接用):
nginx.conf
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for '
'"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time" "$http_host" $request_length';
nginx-logstash.conf
grok {
match => {"message" => "%{IP:remote_addr} - %{USER:remote_user} \[%{HTTPDATE:time_local}\] \"%{WORD:method} %{URIPATHPARAM:request} %{DATA:http_version}\" %{NUMBER:status:int} %{NUMBER:body_bytes_sent:int} %{DATA:http_referer} %{QUOTEDSTRING:http_user_agent} %{DATA:http_x_forwarded_for} %{DATA:upstream_addr} %{DATA:upstream_status} \"%{NUMBER:upstream_response_time:float}\" \"%{NUMBER:request_time:float}\" %{DATA:http_host} %{NUMBER:request_length}"}
}