ElasticSearch - 未设置日期类型

时间:2017-05-02 10:02:40

标签: elasticsearch logstash logstash-grok

我正在尝试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字段。两者都很好

1 个答案:

答案 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] ==