清漆日志上的 _grokparsefailure

_grokparsefailure on varnish log

消息看起来像

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

我的 grok 模式是

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

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

ES 中的完整消息是

{
  "_index": "logstash-2016.04.19",
  "_type": "syslog",
  "_id": "AVQt7WSCN-2LsQj9ZIIq",
  "_score": null,
  "_source": {
    "message": "212.95.71.201 \"-\" - - [19/Apr/2016:11:50:12 +0200] \"GET http://monsite.com/api/opa/status HTTP/1.1\" 200 92 \"-\" \"curl - API-Player - PREPROD\" hit OPA-PREPROD-API - 0.000132084",
    "@version": "1",
    "@timestamp": "2016-04-19T09:50:12.000Z",
    "type": "syslog",
    "host": "212.95.70.80",
    "tags": [
      "_grokparsefailure"
    ],
    "application": "varnish-preprod",
    "clientip": "1.2.3.4",
    "x_forwarded_for": "-",
    "ident": "-",
    "auth": "-",
    "timestamp": "19/Apr/2016:11:50:12 +0200",
    "verb": "GET",
    "request": "http://monsite.com/api/opa/status",
    "httpversion": "1.1",
    "response": "200",
    "bytes": "92",
    "referrer": "\"-\"",
    "agent": "\"curl - API-Player - PREPROD\"",
    "hitmiss": "hit",
    "varnish_conf": "OPA-PREPROD-API",
    "varnish_backend": "-",
    "time_firstbyte": "0.000132084",
    "geoip": {
      "ip": "1.2.3.4",
      "country_code2": "FR",
      "country_code3": "FRA",
      "country_name": "France",
      "continent_code": "EU",
      "region_name": "C1",
      "city_name": "Strasbourg",
      "latitude": 48.60040000000001,
      "longitude": 7.787399999999991,
      "timezone": "Europe/Paris",
      "real_region_name": "Alsace",
      "location": [
        7.787399999999991,
        48.60040000000001
      ]
    },
    "agentname": "Other",
    "agentos": "Other",
    "agentdevice": "Other"
  },
  "fields": {
    "@timestamp": [
      1461059412000
    ]
  },
  "highlight": {
    "agent": [
      "\"curl - API-Player - @kibana-highlighted-field@PREPROD@/kibana-highlighted-field@\""
    ],
    "varnish_conf": [
      "OPA-@kibana-highlighted-field@PREPROD@/kibana-highlighted-field@-API"
    ],
    "application": [
      "@kibana-highlighted-field@varnish@/kibana-highlighted-field@-@kibana-highlighted-field@preprod@/kibana-highlighted-field@"
    ],
    "message": [
      "1.2.3.4 \"-\" - - [19/Apr/2016:11:50:12 +0200] \"GET http://monsote.com/api/opa/status HTTP/1.1\" 200 92 \"-\" \"curl - API-Player - @kibana-highlighted-field@PREPROD@/kibana-highlighted-field@\" hit OPA-@kibana-highlighted-field@PREPROD@/kibana-highlighted-field@-API - 0.000132084"
    ]
  },
  "sort": [
    1461059412000
  ]
}

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

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

至于你的解析问题,我敢打赌你的 grok 工作得很好。请注意,elasticsearch 可以动态创建字段,并会根据看到的第一个数据猜测字段的类型。如果您的第一个数据是“0”,它会使该字段成为一个整数,并且以后的条目将被转换为该类型。你可以拉动映射看看发生了什么。

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

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

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

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