2013-12-18 44 views
4

我希望有人能帮助我。 Ik具有以下设置:从JSON中提取时间戳并将其用作logstash事件时间戳

shipper >> redis >> logstash >> elasticsearch 

Logstash有一个输入,它从redis中提取日志数据。下面JSON线变为在redis的:

{ 
    "@fields": { 
    "level": "INFO", 
    "mdc": {}, 
    "file": "ContextLoader.java", 
    "class": "org.springframework.web.context.ContextLoader", 
    "line_number": "273", 
    "method": "initWebApplicationContext" 
    }, 
    "@timestamp": "2013-12-18T11::29:29.115+01:00", 
    "@message": "Root WebApplicationContext: initialization started", 
    "@source_host": "test-host" 
} 

的logstash配置我用的是简单的:

input { 
    redis { 
    data_type => "list" 
    key => "logstash:test:host" 
    codec => "json" 
    } 
} 
filter{ 
    date { 
    match => [ "@timestamp", "dd-MMM-YYYY:HH:mm:ssZ", "dd-MMM-YYYY:HH:mm:ss Z", "ISO8601" ] 
    } 
} 
output { 
    stdout{ 
    debug => true 
    } 
} 

当我使用上面的配置,我看到logstash事件的时间戳用于(2013-12-18T12:53:14.169Z)和我收到以下错误从我的调试屏幕:

Failed parsing date from field {:field=>"@timestamp", :value=>"2013-12-18T12:53:14.177Z", :exception=>#<TypeError: cannot convert instance of class org.jruby.RubyTime to class java.lang.String>, :level=>:warn} 

由此,我可以得出如下结论:

当日志条目作为输入进来时,json日志条目的时间戳会被logstash的timestamp事件覆盖。然后,当日期过滤器试图解析时间戳时,它会失败,因为没有匹配。

我想使用json日志条目的时间戳作为我的logstash事件时间戳。我怎样才能做到这一点?我使用logstash版本1.3.1。

+0

Bug看起来相关:[LOGSTASH-1340:如果过滤器用字符串刷新事件失败替换@timestamp](https://logstash.jira.com/browse/LOGSTASH-1340)。有几个人提出了可能尝试的解决方法。 – rutter

+0

是的,我认为是。日Thnx。 – user3115768

+0

您的示例中的“T11 :: 29:29”必须是拼写错误,还是? – Rbjz

回答

2

我想你可能误解了date filter(它似乎不是1.3.1的文档),它需要一个字段,并根据你设置的模式解析它,并使用该匹配来设置值@timestamp字段(默认情况下)。由于您正在使用@timestamp字段,将其与模式匹配,然后尝试使用它设置@timestamp字段,您所做的是多余的。

如果你有一个不同的时间戳字段,你想从我预计它可能会工作的日期,只要你在该领域使用正确的模式。

我还建议你更新到1.4.2,因为你运行的旧版本可能是越野车。