4

我希望有人可以帮助我。我有以下设置:

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 的时间戳事件覆盖。然后,当日期过滤器尝试解析时间戳时,它会失败,因为没有匹配。

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

4

1 回答 1

2

我认为您可能误解了日期过滤器(似乎没有 1.3.1 的文档)的工作原理,它接受一个字段,并根据您设置的模式对其进行解析,并使用该匹配项来设置 @ 的值时间戳字段(默认)。由于您正在获取 @timestamp 字段,将其与模式匹配,然后尝试使用它设置 @timestamp 字段,因此您所做的事情是多余的。

如果您有一个不同的时间戳字段,您想从我期望的日期中获取它可能会起作用,只要您对该字段使用正确的模式。

我还建议您更新到 1.4.2,因为您正在运行的旧版本可能有问题。

于 2014-12-17T11:31:12.243 回答