清漆日志上的_grokparsefailure

时间:2016-04-19 09:53:03

标签: logstash logstash-grok

消息看起来像

var fs = require("fs");
var util = require("util");
var resAsString = util.inspect(res);
fs.writeFileSync("inspect-res.json", resAsString, "utf8");

我的格言模式是

1.2.3.4 "-" - - [19/Apr/2016:11:42:18 +0200] "GET http://monsite.vpù/api/opa/status HTTP/1.1" 200 92 "-" "curl - API-Player - PREPROD" hit OPA-PREPROD-API - 0.000144958

我有一个grokparsefailure标签,而我的所有字段都正确完成,除了最后一个,我得到0而不是0.000144958

ES中的完整信息是

grok {
      match => { "message" => "%{IP:clientip} \"%{DATA:x_forwarded_for}\" %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} (%{NOTSPACE:hitmiss}|-) (%{NOTSPACE:varnish_conf}|-) (%{NOTSPACE:varnish_backend}|-) %{NUMBER:time_firstbyte}"}
    }

答案是kibana显示的数字不是很少

2 个答案:

答案 0 :(得分:1)

如果grok,嗯,你只会失败,你只会得到一个grokparsefailure。所以,不是这个grok产生标签。在groks中使用tag_on_failure参数为每个grok提供唯一标记。

关于你的解析问题,我打赌你的grok工作得很好。请注意,elasticsearch可以动态创建字段,并根据看到的第一个数据猜测字段的类型。如果您的第一个数据是" 0",它将使该字段成为整数,之后的条目将转换为该类型。您可以拉出映射以查看发生的情况。

您需要控制创建的映射。您可以指定该字段是grok中的浮点数(%{NUMBER:myField:int})或创建自己的模板。

另请注意,NOTSPACE匹配" - ",因此varnish_backend等的模式并不完全正确。

答案 1 :(得分:0)

问题来自于内部使用grok的syslog过滤器,如https://kartar.net/2014/09/when-logstash-and-syslog-go-wrong/所述。 然后解决方案是删除我自己的过滤器中的标签

另一个问题是kibana不显示像0.0000xxx这样的数字,但无论如何它们都是正确存储的,所以无论如何我都可以使用它。