logstash处理nginx日志时,字段总是进不到ES里面,那就是你grok语句写错了!

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.类型要匹配

扫描二维码关注公众号,回复: 12369070 查看本文章


示范(可直接用):

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}"}
    }

猜你喜欢

转载自blog.csdn.net/u012452555/article/details/107211766