Logstash解析日期问题

时间:2016-07-25 09:13:04

标签: logstash logstash-grok

我正在使用logstash来读取一些日志。我有一个日志文件,时间戳只包含时间字段,即08:28:20,500,但没有日期字段。我想用今天的日期时间来映射它。我应该如何使用日期过滤器。

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

 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异常,而第二条消息运行正常。我想知道这是怎么发生的,如果有人能给我一些建议。感谢。

{
       "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);
      "
    }
}

1 个答案:

答案 0 :(得分:3)

你可以通过ruby过滤器来做到这一点。 Ruby可以解决这个问题。对不起,我没有尝试使用日期过滤器(可能也可以)。这是我的例子:

我的配置:

input {
  stdin {
  }
}


filter {

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

}


output {
          stdout { codec => rubydebug }
}

输入和输出:

[

artur@pandaadb:~/dev/logstash$ ./logstash-2.3.2/bin/logstash -f conf2/
Settings: Default pipeline workers: 8
Pipeline main started

08:28:20

{
       "message" => "08:28:20",
      "@version" => "1",
    "@timestamp" => "2016-07-25T09:43:28.814Z",
          "host" => "pandaadb",
        "myTime" => 2016-07-25 08:28:20 +0100
}

我只是传递你的字符串,你可以使用你解析的变量,例如红宝石代码中的“时间”。

Ruby在解析日期时非常聪明,并认识到它是一个时间,而不是整个日期。所以它使用今天的时间戳并仅修改时间。

希望有所帮助!

编辑:

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

编辑2:

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

以下是必要的代码:

   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将尝试将整个消息字符串解析为日期。为什么这在第二个日志中起作用对我来说是一个谜:D

您需要将过滤器更改为:

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”中的时间。

此致 阿图尔