Logstash и Ruby или копируем поле @timestamp для удобочитаемости

У меня в ELK попадает большое количество логов с windows серверов и некоторые из них пересылаются на почту. Но есть один недостаток, в самих логах нет информации о времени, когда произошло какое-либо событие. Можно конечно на почту отправлять вместе с логом события и поле @timestamp , но оно не очень то удобочитаемое, да еще и в UTC. Само поле @timestamp не изменяемое и информация в нем хранится только в определенном формате (пример 2017-04-13T15:15:32.405Z ). Поэтому воспользуемся языком программирования ruby и добавим в logstash фильтр.
К сожалению, у меня не получилось воспользоваться классами time и date в ruby, logstash выдавал на них _rubyexception, поэтому пришлось использовать «велосипед» =)
Дальше пример фильтра с комментариями:
filter {
  mutate {
  add_field => { "log_time" => "date" }    #Создаем новое поле с любым текстом                                          
  }
  ruby {                                                  #Подключаем ruby
  code => "
  temp = event.get('@timestamp').to_i;     #Присваиваем переменной temp значение поля @timestamp переведенное в UNIX формат
  t = Time.at(temp).strftime('%e %B %Y at %H:%M');     #Конвертируем UNIX формат даты и времени в формат по маске в скобках
  event.set('log_time', t);     #Записываем получившуюся дату и время в поле log_time
  "}
}
Теперь вместе с логом события можно отправлять поле log_time и получать удобочитаемый текст сообщения, с временем в нужном формате и нашим часовым поясом.
И еще хотелось бы сказать пару слов о тестировании конфига для logstash. Во время тестирования, удобно выводить информацию в консоль, а не писать в ES и потом смотреть там. Для этого используется конструкция stdout { codec => rubydebug }
Вот пример config.conf с тестированием поля log_time:
input { generator { count => 1 } }
filter {
  ruby { code => "
temp=event.get('@timestamp').to_i;
t=Time.at(temp).strftime('%e %B %Y at %H:%M');
event.set('log_time',t);
" }
}
output { stdout { codec => rubydebug } }
После запуска этого конфига командой:
# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/config.conf
В терминале увидим примерно такую картину:
P.S. полезные ссылки: Online Ruby, Date Time в Ruby, Маски для поля Date

2 комментария

    1. В разных проектах использовал разные подходы, но если просто по каким-то конкретным параметрам то самый простой вариант это делать прямо через logstash, используя секцию email в output.
      А так можно посмотреть на эти продукты:
      https://github.com/Yelp/elastalert
      https://opendistro.github.io/for-elasticsearch/

Добавить комментарий

Ваш адрес email не будет опубликован.