2014-12-08 7 views
0

У меня есть журналы, которые имеют только время, как его записьКак изменить @timestamp с записью в журналах, используя logstash

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.... 

и так далее

У меня есть дата в только одну строке журналы. основанный на том, что я хочу создать временную метку, такую ​​как эта дата регистрации в журналах + время в каждой записи

Iam способен получить время в каждой записи. я могу получить log_message => "Logging начал для [....] (Date = [07/28/2014], ...", как одна запись.

  1. Можно ли получить дату из эта запись и изменить метки времени все другой записи в?
  2. , как я могу добавить время и дату и изменить метку времени?

Любая помощь будет оценена как IAM новой для logstash

Мой фильтр в logstash конф

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} 
    } 

} 

Поле времени также имеет миллисекунды.

ответ

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}" 
     } 
    } 
    } 
} 

(Этот пример не был проверен, так что может быть синтаксис/логические ошибки, но он должен получить вас вниз по правильному пути).

+0

Спасибо за ответ. Позвольте мне попробовать. – AD14

+0

Я пробовал это. это отличный плагин. работает отлично. но проблема в том, что он получает дату из строки 2 и обновляет строку 3. Это работает нормально. но я могу обновить строку 1 тоже? (отредактировал вопрос о номерах строк). – AD14

+0

Единственный способ, которым вы сможете получить дату в строке 1, - это как-то использовать «многострочный» плагин, чтобы объединить строки вместе ... Если у вас есть определенный рисунок из строк X в строке, всегда начинающийся с что-то и заканчивая чем-то, есть способы объединить их все вместе, а затем проанализировать их (я написал плагин 'multieline_fixed ', чтобы сделать что-то подобное, но я его никогда не выпускал). – Alcanzar

Смежные вопросы