Syslog时间戳没有年份?

时间:2015-04-01 07:01:53

标签: elasticsearch logstash kibana

我正在将我的日志回填到Elasticsearch中。因此,为了按日期在其时间戳中创建索引,我使用date过滤器,如下所示:

date {
                "locale" => "en"
                match => ["timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601"]
                target => "@timestamp"
        }

我正在使用syslog中的日志,而syslog时间戳格式没有年份:

# Syslog Dates: Month Day HH:MM:SS
SYSLOGTIMESTAMP %{MONTH} +%{MONTHDAY} %{TIME}

因此,在使用日期过滤器后,创建的索引就像logstash-2015.12.26 如果我正在阅读2014年12月26日的日志。因此,由于日志中没有时间戳,因此默认情况下会选择当前年份。

知道如何制作正确的索引吗?

4 个答案:

答案 0 :(得分:7)

在Joda Time解析的字符串中没有一年,Logstash当前默认为Logstash进程启动的年份。见github.com/logstash-plugins/logstash-filter-date bug #3。作为临时解决方法,添加临时过滤器以将正确的年份(2014)追加到时间戳字段的末尾,并调整date filter模式以包含YYYY。

filter {
  mutate {
    replace => ["timestamp", "%{timestamp} 2014"]
  }
  date {
    locale => "en"
    match => ["timestamp",
              "MMM  d HH:mm:ss YYYY",
              "MMM dd HH:mm:ss YYYY",
              "ISO8601"]
  }
}

答案 1 :(得分:1)

您可以使用日期过滤器将日期字符串转换为日期格式。默认情况下,使用日期过滤器时,日志的日期(或日期时间)将覆盖@timestamp。 因此,在您的过滤器中,您不需要定位。如果要将变量字符串转换为日期,则只需使用它。

实施例:          match =&gt; [&#34;时间戳&#34;,&#34; MMM d HH:mm:ss&#34;,&#34; MMM dd HH:mm:ss&#34;,&#34; ISO8601&#34;] < / p>

答案 2 :(得分:0)

如果您加载的日志文件在文件名中包含年份,则可以使用grok过滤器提取它,创建一个新字段,其中包含您从syslog中提取的日期以及文件名中的年份。

如何从文件名中提取日期/时间的示例可在此处找到:Logstash: How to use date/time in a filename as an imported field

答案 3 :(得分:0)

使用 ruby​​ 函数,我能够将日期动态设置为上一年(如果日志日期大于当前 YYYY)。读取并计算事件日期以查看其是否大于当前系统日期。如果是,则减去 365 天,并覆盖时间戳。

ruby {
   code => 'require "date"
   am_date = "%b %d %H:%M:%S"
   parsed=DateTime.strptime(event.get("timestamp"), am_date)
   m_now=DateTime.now

 if parsed>m_now
    parsed=parsed-365
 else
    parsed=parsed
 end

 event.set("timestamp", parsed.to_s) '
}

这将防止对日期进行任何硬编码。