Logstash将日期转换为有效的joda时间(@timestamp)

时间:2013-06-26 12:16:12

标签: elasticsearch logstash

希望有人可以帮助我!

我对logstash有疑问。我成功了下一个日期:26 / Jun / 2013:14:00:26 +0200

接下来,我希望将此日期用作事件的@timestamp。如您所知,logstash会自动添加时间戳。

替换logstash正在添加的时间戳可以通过日期过滤器完成。我添加了以下日期过滤器:match => [“日期”,“dd / MMM / YYYY:HH:mm:ss Z”]

但是,出于某种原因,这不起作用。当我测试它时,我看到logstash只是添加了他自己的时间戳。

代码:

grok {
    type => "log-date"
    pattern => "%{HTTPDATE:date}"
}

date{
    type => "log-date"
    match => [ "date", "dd/MMM/YYYY:HH:mm:ss Z"]
}

我需要这样做,所以我可以向elasticsearch添加事件。

提前致谢!

2 个答案:

答案 0 :(得分:8)

我使用了以下方法:

# strip the timestamp and force event timestamp to be the same.
# the original string is saved in field %{log_timestamp}.
# the original logstash input timestamp is saved in field %{event_timestamp}.
grok {
  patterns_dir => "./patterns"
  match => [ "message", "%{IRODS_TIMESTAMP:log_timestamp}" ]
  add_tag => "got_syslog_timestamp"
  add_field => [ "event_timestamp", "%{@timestamp}" ]
}

date {
  match => [ "log_timestamp", "MMM dd HH:mm:ss" ]
}

mutate {
        replace => [ "@timestamp", "%{log_timestamp}" ]
}

我现在的问题是,即使更换了@timestamp,我也希望首先将它转换为ISO8601兼容格式,以便其他程序在解释它时没有问题,例如“event_timestamp”中存在的时间戳:

     "@timestamp" => "Mar  5 14:38:40",
       "@version" => "1",
           "type" => "irods.relog",
           "host" => "ids-dev",
           "path" => "/root/logstash/reLog.2013.03.01",
            "pid" => "5229",
          "level" => "NOTICE",
  "log_timestamp" => "Mar  5 14:38:40",
"event_timestamp" => "2013-09-17 12:20:28 UTC",
           "tags" => [
    [0] "got_syslog_timestamp"
]

你可以轻松转换它,因为你有年份信息...在我的情况下,我将不得不从“路径”(文件名)属性解析...但仍然,似乎没有convert_to_iso8901 => @timestamp指令。

希望这对你的问题有帮助! :)

答案 1 :(得分:5)

上述答案只是解决方法!尝试在代码中添加 locale => "en"
如果没有添加,日期工作日和月份名称将使用默认的平台语言环境语言(西班牙语,法语或其他)进行解析,这就是为什么它不起作用(因为您的日志是英文)。

date{
    type => "log-date"
    match => [ "date", "dd/MMM/YYYY:HH:mm:ss Z"]
    locale => "en"
}