2016-07-25 151 views
0

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

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

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

我没有看到你的样本日志行任何时间戳(日期或时间)。 – Val

+0

对不起,我错了。我现在编辑它。感谢提醒。 –

+1

我假设日期过滤器匹配“时间”而不是“时间戳”?或者是“Timestamp”另一个字段? – pandaadb

回答

3

你可以通过ruby过滤器做到这一点。 Ruby可以解析这个开箱即用的问题。对不起,我没有用日期过滤器试过它(也可能工作)。这是我的例子:

我的配置:

input { 
    stdin { 
    } 
} 


filter { 

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

} 


output { 
      stdout { codec => rubydebug } 
} 

输入输出:

[

[email protected]:~/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是相当聪明的。所以它使用今天的时间戳并仅修改时间。

希望有帮助!

编辑:

我刚才试了日期过滤器和一个工作方式不同。它将日期设置为今年的第一天。所以看起来,红宝石过滤器将是您的解决方案,因为日期过滤器不提供任何日期修改,我知道修改匹配后的日期。

编辑2:

在评论你问如何把它写进@timestmap领域。 @timestamp字段是一个预定义的字段,需要Logstash时间戳对象(而不是字符串或日期时间对象)。所以你可以直接写入该字段,但是你必须创建一个对象。 (或者这也将使用日期过滤器工作,但为什么双过滤器)

这是必要的代码:

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

编辑:

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

从你的更新日志,你可以看到你神交被正确解析的东西,如:

"message" => "10:30:39 FATAL [org.jboss.as.server] (default task-1) JBAS015957: Server boot has failed in an unre ...", 
"Time" => "10:30:39" 

在你的过滤器,但是你引用“消息”事件的变量,而不是“时间”变量。 所以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); 
     " 
    } 
} 

这将告诉解析采取了在事件现场的时间“时间”。

问候, 阿图尔

+0

感谢您的回答。只是一个简单的问题。这是否意味着我应该首先使用ruby过滤器来创建一个新的字段(即myTime),然后使用日期过滤器来使用@timestamp映射新字段? –

+1

@KennedyKan你可以立即将它写入“@timestamp”。没有必要做一个双重过滤器。但是,您将不得不创建一个时间戳记logstash对象。我会为你更新答案 – pandaadb

+0

谢谢。它完美的作品。 –