我在年初的时候注意到了这一点,我已经在#elasticsearch和#logstash中多次询问过这个问题,但从来没有得到过一个回复来解释最好的方法来阻止它。我也在mailing list上发现了这篇文章,但它没有讨论如何阻止它在未来发生。
目前在elasticsearch中,我有一些自动创建的索引,这些索引已于2015年11月至2015年12月自动创建。从logstash读取日志并将结果发送到elasticsearch时,会自动创建索引。有问题的日志是未在时间戳中指定年份的日志,然后我采用时间戳并使用日期匹配功能将该时间戳设置为@timestamp系统字段。 EG:
{"message":"Dec 31 12:03:00 server sudo: zabbix : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/sbin/asterisk -rx meetme","@version":"1","@timestamp":"2015-12-31T12:03:00.000Z","file":"/var/log/secure","host":"server","offset":"74","type":"syslog","syslog_timestamp":"Dec 31 12:03:00","syslog_hostname":"server","syslog_program":"sudo","syslog_message":" zabbix : TTY=unknown ; PWD=/ ; USER=root ; COMMAND=/usr/sbin/asterisk -rx meetme","tags":["syslog"],"syslog_severity_code":5,"syslog_facility_code":1,"syslog_facility":"user-level","syslog_severity":"notice"}
此字段的@timestamp值设置为:
December 31st 2015, 12:03:00.000
我相信这些日志在年份更改为2015之后由logstash处理,我不确定,但我可能在处理日志之前重新启动了logstash。我认为我重新启动logstash的原因是,我认为当logstash启动时检查年份,如果应用了日期过滤器且事件中未指定年份,则Logstash假定年份必须是系统重新启动时所用的当前年份elasticsearch将来会对索引应用这些事件。
自动创建索引的能力很强,我不想停止这样做,但有没有办法阻止Logstash / elasticsearch在当前年底处理时自动生成索引记录去年年底的事件时间戳,以便日志进入正确的索引(即去年的索引)
答案 0 :(得分:2)
根据日期过滤器中的代码:
https://github.com/elastic/logstash/blob/v1.4.2/lib/logstash/filters/date.rb#L153
当logstash不知道日志事件发生在哪一年(无法解析年份)时,它将假定它是当前年份。 (在运行时查询)
看到生效的年份刚刚丢失(将被假定为当前年份),您唯一能做的就是在时间间隔条件下放弃事件。
我认为您正在寻找的解决方案是:
可以匹配“未来”*年/月,并删除这些事件:
filter {
mutate {
add_field => { "year_month" => "%{+yyyyMM}" }
}
if [year_month] =~ /^20151[012]$/ {
drop { }
}
}
*显示为将来,但它们实际上属于前一年。
有可能做更高级的正则表达式以更好地匹配未来的事件。
答案 1 :(得分:0)
事实证明,在进一步挖掘之后,这是一个bug