Logstash 使用当前年份作为不带年份的时间戳,并显示具有未来日期的事件

Logstash uses current year for timestamp without year and shows events with future dates

我有一些日志,其中没有提到年份,在解析时,logstash 添加当前年份并使事件出现在未来的日期。

我在论坛上查看了类似的问题,但不幸的是,没有任何解决方案。根据讨论,日期过滤器应该自动输入正确的年份,但在我的情况下并没有发生。以下是日志时间戳的示例。

Tue Oct 20 11:04:30.996 data: zone1 data: zone2 这是 2020 年 10 月的日志日期。

我得到的输出是

          "new" => 2021-10-19T08:04:30.996Z,
      "logtime" => "Tue Oct 20 11:04:30.996",
         "path" => "/home/zone.log",
      "message" => "Tue Oct 20 11:04:30.996 data: zone1 data: zone2",

Grok/date 过滤器是:

grok
        {
        match => { "message" => "(?<logtime>%{DAY} %{MONTH} %{MONTHDAY} %{HOUR}:%{MINUTE}:%{SECOND}) ........" }
        }

        date
        {
        match =>  [ "logtime", "EEE MMM dd HH:mm:ss.SSS"  ] 
        target => "new"
        }

没有 dateparsefailure 但时间戳进入未来。请大家指教。

日期过滤器不可能在所有情况下都知道正确的年份。 issue 已经在 github 上开放了好几年,那里有很多关于如何修复它的讨论。但是,我不希望它得到解决。

parser 有一些试探法来猜测正确的年份:

  • 如果时间戳是从 12 月开始的,而当前日期是 1 月,则假设它是去年的。
  • 如果时间戳是从一月开始的,而当前日期是十二月,则假设它是从明年开始的。
  • 否则使用当前年份。

如果该逻辑对您不起作用,那么您将不得不实现自己的逻辑,可能在 ruby 过滤器中,以决定在使用日期过滤器解析时间戳之前将哪一年添加到时间戳中。

如果您以后只想删除活动,可以使用

ruby { code => 'if Time.now.to_f < event.get("@timestamp").to_f ; event.cancel ; end' }