2015-04-01 48 views
6

我正在将我的日志回填到Elasticsearch中。因此,创建通过日志日期索引在它的时间戳,我用date过滤器这样的:系统日志时间戳无年?

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

我使用日志从系统日志和系统日志时间戳格式行得有一年:

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

所以在使用日期过滤器后,如果我正在阅读2014年12月26日的日志,则创建的索引与logstash-2015.12.26 类似。因此,由于时间戳在日志中不可用,因此它默认选择当前年份。

任何想法如何使正确的索引?

回答

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

所以除了临时硬代码,有没有任何解决方法? – 2015-04-01 09:00:11

+0

我不相信有,没有。那么,除了重置运行Logstash的机器上的时间,但这是一个非常糟糕的主意。 – 2015-04-01 10:10:04

1

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

示例: 匹配=> [ “时间戳”, “MMM d HH:MM:SS”, “MMM DD HH:MM:SS”, “ISO8601”]