如何停止在错误的年份自动创建 elasticsearch 索引
What to do to stop elasticsearch indexes being created automatically in the wrong year
我在年初注意到了这一点,我已经在#elasticsearch 和#logstash 中询问过几次,但从未得到解释解释如何最好地阻止它的回应。我也在 mailing list 上找到了这个 post,但它没有讨论如何阻止它在未来发生。
目前在 elasticsearch 中,我有一些索引是在 2015 年 11 月至 2015 年 12 月自动创建的。这些索引是在从 logstash 读取日志并将结果发送到 elasticsearch 时自动创建的。有问题的日志是时间戳中未指定年份的日志,然后我获取了时间戳并使用日期匹配函数将该时间戳设置为@timestamp 系统字段。例如:
{"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 在当年年底自动生成索引它处理具有去年年底事件时间戳的日志,以便日志将进入正确的索引(即去年的索引)
根据日期过滤器中的代码:
https://github.com/elastic/logstash/blob/v1.4.2/lib/logstash/filters/date.rb#L153
当logstash 不知道日志事件发生在哪一年(无法解析年份)时,它会假定它是当前年份。 (在运行次查询)
看到有效的年份丢失了(然后将假定为当前年份),您唯一能做的就是在时间间隔的条件下删除事件。
我认为您正在寻找的解决方案是这样的:
可以匹配 "future"* year/month,并删除这些事件:
filter {
mutate {
add_field => { "year_month" => "%{+yyyyMM}" }
}
if [year_month] =~ /^20151[012]$/ {
drop { }
}
}
*显示为未来,实际属于前一年
可以使用更高级的正则表达式来更好地匹配未来的事件。
经过进一步挖掘发现这是一个 bug
我在年初注意到了这一点,我已经在#elasticsearch 和#logstash 中询问过几次,但从未得到解释解释如何最好地阻止它的回应。我也在 mailing list 上找到了这个 post,但它没有讨论如何阻止它在未来发生。
目前在 elasticsearch 中,我有一些索引是在 2015 年 11 月至 2015 年 12 月自动创建的。这些索引是在从 logstash 读取日志并将结果发送到 elasticsearch 时自动创建的。有问题的日志是时间戳中未指定年份的日志,然后我获取了时间戳并使用日期匹配函数将该时间戳设置为@timestamp 系统字段。例如:
{"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 在当年年底自动生成索引它处理具有去年年底事件时间戳的日志,以便日志将进入正确的索引(即去年的索引)
根据日期过滤器中的代码:
https://github.com/elastic/logstash/blob/v1.4.2/lib/logstash/filters/date.rb#L153
当logstash 不知道日志事件发生在哪一年(无法解析年份)时,它会假定它是当前年份。 (在运行次查询)
看到有效的年份丢失了(然后将假定为当前年份),您唯一能做的就是在时间间隔的条件下删除事件。
我认为您正在寻找的解决方案是这样的:
可以匹配 "future"* year/month,并删除这些事件:
filter {
mutate {
add_field => { "year_month" => "%{+yyyyMM}" }
}
if [year_month] =~ /^20151[012]$/ {
drop { }
}
}
*显示为未来,实际属于前一年
可以使用更高级的正则表达式来更好地匹配未来的事件。
经过进一步挖掘发现这是一个 bug