2016-07-25 5 views
0

Я использую logstash для чтения некоторых журналов. У меня есть файл журнала, который временная метка состоит только из поля времени, то есть 08: 28: 20,500, но не имеет поля даты. Я хотел бы сопоставить его с сегодняшним днем. Как мне это сделать с фильтром даты.Logstash Parse Date Issue

Строка моего файла журнала выглядит следующим образом.

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" 

Есть ли кто-нибудь, кто может помочь в этом вопросе? Большое спасибо заранее.

EDIT После использования рубина в качестве фильтра мне удалось решить проблему. Однако иногда бывает исключение рубина. Как видно из нижеследующего, первое сообщение встретило исключение 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

Я предполагаю, что фильтр даты соответствует «Время» не «Временная метка»? Или где-то находится «временная метка»? – pandaadb

ответ

3

вы можете сделать это через рубиновый фильтр. 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.

Ruby довольно умен при анализе дат и признает, что это время, а не целая дата. Таким образом, он использует сегодняшнюю метку времени и изменяет только время.

Надеюсь, что это поможет!

EDIT:

Я попробовал фильтр даты только сейчас, и что один работает по-другому. Он устанавливает дату до 1-го числа этого года. Таким образом, похоже, что рубиновый фильтр будет вашим решением, поскольку фильтр даты не предлагает никаких модификаций даты, которые, как мне известно, изменяют дату после того, как она была сопоставлена.

EDIT 2:

В комментарии вы спросили, как писать его в поле @timestmap. Поле @timestamp является предопределенным полем, в котором ожидаются объекты Timestamp Logstash (а не объект string или datetime). Поэтому вы можете записать его прямо в это поле, но вы должны создать объект. (В качестве альтернативы это также будет работать, используя фильтр даты, но почему двойные фильтры)

Вот необходимый код:

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

EDIT:

Что касается обновленного вопроса, ваш вопрос что вы используете неправильную переменную в своем событии.

От вашего обновления журнала, вы можете увидеть, что ваш 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" 

В фильтре однако вы ссылаетесь на «сообщение» переменной события, а не «Время» переменная. Итак, 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 timestamp. Я обновлю ответ за вас – pandaadb

+0

спасибо. Он работает отлично. –