我正在尝试ELK堆栈,到目前为止一直很好:)
我遇到了奇怪的情况,即解析日期字段并将其发送给ElasticSearch。我设法解析该字段,它确实在ElasticSearch中创建,但它总是以字符串形式结束。 我尝试了很多不同的组合。此外,我尝试了许多人们建议的不同的东西,但我仍然失败了。
这是我的设置:
来自Filebeat的字符串:
[2017-04-26 09:40:33] security.DEBUG:在会话中存储安全令牌。 {" key":" securitysecured_area"} []
[2017-04-26 09:50:42] request.INFO:匹配的路线" home_logged_in"。 {" route_parameters" {"控制器":"的appbundle \控制器\ HomeLoggedInController ::的showAction""区域设置":"德& #34;,"路由":" homelogged_in"}," request_uri":" https://qa.someserver.de/de/home"} []
logstash解析部分:
if [@metadata][type] == "feprod" or [@metadata][type] == "feqa"{
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:logdate}" }
}
date {
#timezone => "Europe/Berlin"
match => [ "logdate", "yyyy-MM-dd HH:mm:ss"]
}
}
根据文档,我的@timestamp字段应该用logdate值覆盖。但它没有发生。
在ElasticSearch中,我可以看到正在创建字段logdate,其值为2017-04-26 09:40:33,但其类型为字符串。
我总是从零创建索引,我先删除它,然后让logstash填充它。
我需要用实际日期覆盖@timestamp(而不是索引的日期),或者使用日期类型创建logdate字段。两者都很好
答案 0 :(得分:1)
除非您明确将[@metadata][type]
添加到您未显示的位置,否则这就是您的问题。默认情况下未设置,{type 1}}默认设置为'type =>'输入参数。
您可以使用最小的完整示例对此进行验证:
[type]
运行它:
input {
stdin {
type=>'feprod'
}
}
filter {
if [@metadata][type] == "feprod" or [@metadata][type] == "feqa"{
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:logdate}" }
}
date {
match => [ "logdate", "yyyy-MM-dd HH:mm:ss"]
}
}
}
output {
stdout { codec => "rubydebug" }
}
获得输出:
echo '[2017-04-26 09:40:33] security.DEBUG: Stored the security token in the session. {"key":"securitysecured_area"} []' | bin/logstash -f test.conf
如果你只使用{
"@timestamp" => 2017-05-02T15:15:05.875Z,
"@version" => "1",
"host" => "xxxxxxxxx",
"message" => "[2017-04-26 09:40:33] security.DEBUG: Stored the security token in the session. {\"key\":\"securitysecured_area\"} []",
"type" => "feprod",
"tags" => []
}
......它会正常工作。
if [type] ==