清漆日志上的 _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 这样的数字,但无论如何它们都正确存储所以我无论如何都可以使用它。
消息看起来像
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 这样的数字,但无论如何它们都正确存储所以我无论如何都可以使用它。