Logstash 日志存储解析日期问题

Logstash 日志存储解析日期问题,logstash,logstash-grok,Logstash,Logstash Grok,我正在使用logstash阅读一些日志。我有一个日志文件,时间戳只包含时间字段,即08:28:20500,但没有日期字段。我想把它和今天的日期时间对应起来。我应该如何使用日期过滤器来实现这一点 我的日志文件的一行是这样的 08:28:20,500 INFO [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010403: Deploying JDBC-compliant

我正在使用logstash阅读一些日志。我有一个日志文件,时间戳只包含时间字段,即08:28:20500,但没有日期字段。我想把它和今天的日期时间对应起来。我应该如何使用日期过滤器来实现这一点

我的日志文件的一行是这样的

 08:28:20,500 INFO  [org.jboss.as.connector.subsystems.datasources] (ServerService Thread Pool -- 27) JBAS010403: Deploying JDBC-compliant driver class org.h2.Driver (version 1.3)>>"C:\CIGNA\jboss\jboss.log"
有没有人可以帮助解决这个问题?非常感谢

编辑 在使用ruby作为过滤器之后,我成功地解决了这个问题。然而,偶尔会有一个ruby异常。从下面可以看到,第一条消息遇到了ruby异常,而第二条消息运行正常。我想知道这是怎么发生的,如果有人能给我一些建议。谢谢

{
       "message" => "10:30:39 FATAL [org.jboss.as.server] (default task-1) JBAS015957: Server boot has failed in an unre
coverable manner; exiting. See previous messages for details.\r",
      "@version" => "1",
    "@timestamp" => "2016-07-26T02:43:17.379Z",
          "path" => "C:/CIGNA/jboss/jboss.log",
          "host" => "SIMSPad",
          "type" => "txt",
          "Time" => "10:30:39",
         "Level" => "FATAL",
     "JavaClass" => "org.jboss.as.server",
       "Message" => "(default task-1) JBAS015957: Server boot has failed in an unrecoverable manner; exiting. See previo
us messages for details.\r",
          "tags" => [
        [0] "_rubyexception"
    ]
}
{
       "message" => "10:30:39 DEBUG [org.jboss.as.quickstarts.logging.LoggingExample] (default task-1) Settings reconfig
ured: JBOSS EAP Resettlement\r",
      "@version" => "1",
    "@timestamp" => "2016-07-26T02:30:39.000Z",
          "path" => "C:/CIGNA/jboss/jboss.log",
          "host" => "SIMSPad",
          "type" => "txt",
          "Time" => "10:30:39",
         "Level" => "DEBUG",
     "JavaClass" => "org.jboss.as.quickstarts.logging.LoggingExample",
       "Message" => "(default task-1) Settings reconfigured: JBOSS EAP Resettlement\r"
}
在logstash.conf文件中更新的过滤器部分如图所示

filter {
  grok {
    match => { "message" => '\A%{TIME:Time}%{SPACE}%{WORD:Level}%{SPACE}\[%{PROG:JavaClass}]%{SPACE}%{JAVALOGMESSAGE:Message}'}
  }
   ruby {
      code => "
        p = Time.parse(event['message']);
        event['@timestamp'] = LogStash::Timestamp.new(p);
      "
    }
}

您可以通过ruby过滤器实现这一点。Ruby可以直接解析这个问题。对不起,我还没有尝试使用日期过滤器(可能也可以)。以下是我的例子:

我的配置:

input {
  stdin {
  }
}


filter {

    ruby {
      code => "
        p = Time.parse(event['message']);
        event['myTime'] = p;
      "
    }

}


output {
          stdout { codec => rubydebug }
}
输入和输出:

[

我只是传递字符串,您可以使用解析的变量,例如ruby代码中的“Time”

Ruby在解析日期时非常聪明,能够识别出这是一个时间,而不是一个完整的日期,因此它使用今天的时间戳,只修改时间

希望有帮助

编辑:

我刚刚尝试了日期过滤器,但它的工作方式有所不同。它将日期设置为今年的1号。因此,ruby过滤器似乎将是您的解决方案,因为日期过滤器不提供我所知的任何日期修改,以在匹配日期后修改日期

编辑2:

在评论中,您询问了如何将其写入@timestmap字段。@timestamp字段是一个预定义字段,需要一个Logstash时间戳对象(不是字符串或datetime对象)。因此,您可以直接将其写入该字段,但必须创建一个对象。(或者,使用日期过滤器也可以这样做,但为什么要将过滤器加倍)

以下是必要的代码:

   ruby {
      code => "
        p = Time.parse(event['message']);
        event['@timestamp'] = LogStash::Timestamp.new(p);
      "
    }
编辑:

关于更新的问题,您的问题是您在事件中使用了错误的变量

从日志更新中,您可以看到您的grok正在正确解析内容,例如:

"message" => "10:30:39 FATAL [org.jboss.as.server] (default task-1) JBAS015957: Server boot has failed in an unre ...",
"Time" => "10:30:39"
然而,在过滤器中,您引用的是事件的“message”变量,而不是“Time”变量。 所以ruby将尝试将整个消息字符串解析为一个日期

您需要将过滤器更改为:

filter {
  grok {
    match => { "message" => '\A%{TIME:Time}%{SPACE}%{WORD:Level}%{SPACE}\[%{PROG:JavaClass}]%{SPACE}%{JAVALOGMESSAGE:Message}'}
  }
   ruby {
      code => "
        p = Time.parse(event['Time']);
        event['@timestamp'] = LogStash::Timestamp.new(p);
      "
    }
}
这将告诉解析使用事件字段“time”中的时间

问候,,
Artur

您可以通过ruby filter来完成。ruby可以直接解析。很抱歉,我没有尝试使用日期筛选器(可能也可以)。以下是我的示例:

我的配置:

input {
  stdin {
  }
}


filter {

    ruby {
      code => "
        p = Time.parse(event['message']);
        event['myTime'] = p;
      "
    }

}


output {
          stdout { codec => rubydebug }
}
输入和输出:

[

我只是传递字符串,您可以使用解析的变量,例如ruby代码中的“Time”

Ruby在解析日期时非常聪明,能够识别出这是一个时间,而不是一个完整的日期,因此它使用今天的时间戳,只修改时间

希望有帮助

编辑:

我刚刚尝试了日期过滤器,但它的工作方式有所不同。它将日期设置为今年的1号。因此,ruby过滤器似乎将是您的解决方案,因为日期过滤器不提供我所知的任何日期修改,以在匹配日期后修改日期

编辑2:

在评论中,您询问了如何将其写入@timestmap字段。@timestamp字段是一个预定义字段,需要一个Logstash时间戳对象(不是字符串或datetime对象)。因此,您可以直接将其写入该字段,但必须创建一个对象。(或者,使用日期过滤器也可以这样做,但为什么要将过滤器加倍)

以下是必要的代码:

   ruby {
      code => "
        p = Time.parse(event['message']);
        event['@timestamp'] = LogStash::Timestamp.new(p);
      "
    }
编辑:

关于更新的问题,您的问题是您在事件中使用了错误的变量

从日志更新中,您可以看到您的grok正在正确解析内容,例如:

"message" => "10:30:39 FATAL [org.jboss.as.server] (default task-1) JBAS015957: Server boot has failed in an unre ...",
"Time" => "10:30:39"
然而,在过滤器中,您引用的是事件的“message”变量,而不是“Time”变量。 所以ruby将尝试将整个消息字符串解析为一个日期

您需要将过滤器更改为:

filter {
  grok {
    match => { "message" => '\A%{TIME:Time}%{SPACE}%{WORD:Level}%{SPACE}\[%{PROG:JavaClass}]%{SPACE}%{JAVALOGMESSAGE:Message}'}
  }
   ruby {
      code => "
        p = Time.parse(event['Time']);
        event['@timestamp'] = LogStash::Timestamp.new(p);
      "
    }
}
这将告诉解析使用事件字段“time”中的时间

问候,,
Artur

我在您的示例日志行中没有看到任何时间戳(日期或时间)。抱歉,我错拍了。我现在已经编辑了它。感谢提醒。我假设日期筛选器匹配的是“时间”而不是“时间戳”?或者是“时间戳”某个地方的另一个字段?日期筛选器中的匹配必须在
时间
字段上进行,而不是在您的示例中不存在的时间戳上进行。此外,对于milliseconds@pandaadb我已经更正了这个问题。这只是一个打字错误。很抱歉让人困惑。我没有看到任何时间戳(日期或时间)在您的示例日志行中。抱歉,我复制错误。我现在已经编辑了它。谢谢提醒。我假设日期筛选器匹配的是“时间”而不是“时间戳”?或者是“时间戳”某个地方的另一个字段?日期筛选器中的匹配必须在
时间
字段上进行,而不是在您的示例中不存在的时间戳上进行。此外,对于milliseconds@pandaadb我已经更正了这个问题。这只是一个打字错误。很抱歉让人困惑。谢谢你的回答。只是简单地问一下这是否意味着我应该首先使用ruby过滤器创建一个新字段(即myTime),然后使用日期过滤器将新字段映射为@timestamp?@KennedyKan您可以将其写入“@timestamp”马上。不需要进行双重筛选。但是,您必须创建一个timestamp logstash对象。我将为您更新答案。很抱歉再次出现一些混淆。ruby在大多数情况下运行平稳,但是,我