【问题标题】:How to modify @timestamp with an entry in logs using logstash如何使用logstash在日志中修改@timestamp
【发布时间】:2014-12-09 19:59:27
【问题描述】:

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

   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 => " Logging started for [....] (Date=[07/28/2014], ..." 作为一个条目。

  1. 是否可以从此条目中获取日期并修改所有其他条目的时间戳?
  2. 如何添加时间和日期并修改时间戳?

任何帮助将不胜感激,因为我是 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}
  }

}

时间字段也有毫秒。

【问题讨论】:

    标签: logstash


    【解决方案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}"
          }
        }
      }
    }
    

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

    【讨论】:

    • 感谢您的回复。让我试试这个。
    • 我试过这个。这是一个很棒的插件。工作正常。但问题是,它从第 2 行获取日期并更新第 3 行。这很好。但是我也可以更新第 1 行吗?(已经编辑了行号的问题)。
    • 唯一能在第 1 行获取日期的方法是使用 multiline 插件将这些行组合在一起...如果您有明确的 X 模式一行中的行总是以某事开头并以某事结尾,有办法将它们组合在一起然后解析它们(我写了一个multieline_fixed 插件来做类似的事情,但我从未发布过它)。
    • :) 好的。我会试试看。感谢您的快速回复
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-22
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多