如何阻止在错误的一年中自动创建弹性搜索索引

时间:2015-04-28 11:29:26

标签: date elasticsearch logstash

我在年初的时候注意到了这一点,我已经在#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在当前年底处理时自动生成索引记录去年年底的事件时间戳,以便日志进入正确的索引(即去年的索引)

2 个答案:

答案 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