如何使用logstash在日志中使用条目修改@timestamp

时间:2014-12-08 11:04:24

标签: logstash

我有一些只有时间作为条目的日志

   1. 17:20:45.331|ERR|....
   2. 17:20:54.715|SYS|.....Logging started for [....] (Date=[07/28/2014], ...
   3. 17:20:54.716|SYS....

等等

我只在一行日志中有日期。基于我想要创建一个时间戳,例如日志中的记录日期+每个条目中的时间

我能够在每个条目中获得时间。我可以得到log_message => "记录开始[....](日期= [07/28/2014],..."作为一个条目。

  1. 是否可以从此条目中获取日期并修改所有其他条目的时间戳?
  2. 如何添加时间和日期并修改时间戳?
  3. 任何帮助将不胜感激,因为我刚接触了logstash

    我在logstash conf中的过滤器

    filter {
      grok { match => [ "message", "%{TIME:time}\|%{WORD:Message_type}\|%{GREEDYDATA:Component}\|%{NUMBER:line_number}\| %{GREEDYDATA:log_message}"] 
    }
    
    
     date {
        match => ["timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]  => need to modify this as date+%{time}
      }
    
    }
    

    时间字段也有毫秒。

1 个答案:

答案 0 :(得分:1)

您的选择是:

  • 更改记录事项以获取日期
  • 在logstash获取日志之前写一些东西来修复日志(即查找条目的任何东西修改日志)
  • 使用我撰写的memorize插件(我提交了pull request以尝试在将来的版本中获取它。)

该插件详见this answer。使用此解决方案的警告是,如果插件错过了具有日期的行,则您将遇到文件其余部分的问题。如果你重新启动logstash会发生这种情况,所以你需要添加一些逻辑来处理这个问题 - 在下面这个例子中,我假设如果没有看到日期,那就是今天。

使用memorize插件的实现如下所示:

filter {
  if ([message] =~ /Date=/) {
    grok { match => [ "message", "Date=%{DATE:date}" ] }
  }
  # either add the field date to the saved date or pull the date from the saved data
  memorize { fields => ["date"] }
  # if we still don't have a date, lets just assume it's today
  if ([date] == '') {
    ruby {
      code => 'event["date"]=ime.now.strftime("%m/%d/%Y")'
    }
  }
  if ([message] !~ /Date=/) {
    # grok to parse message
    grok { match => [ "message", "%{TIME:time}\|%{WORD:Message_type}\|%{GREEDYDATA:Component}\|%{NUMBER:line_number}\| %{GREEDYDATA:log_message}"] 
    # now add in date
    mutate {
      add_field => {
         datetime => "%{date} %{time}"
      }
    }
  }
}

(此示例尚未经过测试,因此可能存在语法/逻辑错误,但它应该让您走上正确的道路。)