Logstash мониторит log-файлы на основе даты изменения или получает по сети данные по telnet от распределённой
системы, например, контейнеров и после преобразования отравляет на выход, обычно, в Elastic Search. Он прост и
входит в стандартную поставку с Elastic Stack, благодаря чему просто и беспроблемно настраивается. Но благодаря
Java машине внутри тяжёл и не сильно функционален, хотя и поддерживает плагины, например, синхронизации с MySQL
для отправки новых данных. Чуть больше возможностей предоставляет Filebeat. Энтерпрайзным инструментом на все
случаи жизни может служить Fluentd благодаря высокой функциональности (чтение логов, системных журналов и т.д.),
масштабируемости и возможности раскатки по кластерам Kubernetes с помощью Helm чарта, и мониторинг всего
дата-центра в стандартной поставке, но об этом соответствующем разделе.
Для управления логов можно воспользоваться Curator, который сможет архивировать из ElasticSearch старые
логи или их удалять, повышая эффективность его работы.
Процесс получения логов логичен осуществляется специальными сборщиками: logstash, fluentd, filebeat или
другими.
fluentd наименее требовательный и более простой аналог Logstash. Настройка
производится в /etc/td-agent/td-agent.conf, который содержит четыре блока:
** match содержит настройки передачи полученных данных;
** include содержит информацию о типах файлов;
** system содержит настройки системы.
Logstash представляет гораздо более функциональный язык конфигураций. Logstash демон агента logstash мониторит
изменения в файлах. Если же логи находятся не локально, а на распределённой системе, то устанавливается logstash на каждый сервер и
запускается в режиме агента bin/logstash agent -f /env/conf/my.conf. Поскольку запускать
logstash только в качестве агента для пересылки логов расточительно, то можно использовать продукт от тех
же разработчиков Logstash Forwarder (ранее Lumberjack) пересылающий логи по протоколу lumberjack к
logstash серверу. Для отслеживания и получения данных с MySQL можно использовать агент Packetbeat
(https://www.8host.com/blog/sbor-metrik-infrastruktury-s-pomoshhyu-packetbeat-i-elk-v-ubuntu-14-04/).
Также logstash позволяет преобразовать данные разного типа:
** grok задать регулярные выражения выдирания полей из строки, часто для логов из текстового формата в JSON;
** date в случае архивных логов проставить дату создания лога не текущей датой, а взять её из самого лога;
** kv для логов типа key=value;
** mutate выбрать только нужные поля и изменить данные в полях, например, произвести замену символа "/" на "_";
** multiline для многострочных логов с разделителями.
Пример, можно лог в формате "дата тип число" разложить на составляющие, например "01.01.2021 INFO 1" разложить в хэш "message":
filter {
grok {
type => "my_log"
match => ["message", "%{MYDATE:date} %{WORD:loglevel} ${ID.id.int}"]
}
}
Шаблон ${ID.id.int} берёт класс шаблон ID, полученное значение будет подставлено в поле id и строковое значение будет преобразовано к типу int.
В блоке «Output» мы можем указать: выводить данные в консоль с помощью блока "Stdout", в файл "File", передавать по http через JSON REST API "Elasticsearch" или отравлять по почте "Email". Также можно заказать условия по полям, полученным в блоке filter. Например,:
output {
if [type] == "Info" {
elasticsearch {
host => localhost
index => "log-%{+YYYY.MM.dd}"
}
}
}
Здесь индекс Elasticsearch (база данных, если проводить аналогию с SQL) меняется каждый день. Для создания нового индекса не нужно его специально создавать так поступают БД NoSQL, так как нет жёсткого требования описывать структуру свойство и тип. Но всё же описать рекомендуется, иначе все поля будут со строковыми значениями, если не задано число. Для отображения данных Elasticsearch используется плагин WEB-ui интерфейса на AngularJS Kibana. Для отображения временной шкалы в её графиках нужно описать хотя бы одно поле с типом дата, а для агрегатных функция числовое, будь то целое или с плавающей точкой. Также, если добавляются новые поля, для их индексации и отображения требуется произвести пере индексацию всего индекса, поэтому наиболее полное описание структуры поможет избежать очень трудозатратные операции переиндексации.
Разделение индекса по дням сделано для ускорения работы Elasticsearch, а в Kibana можно выбрать несколько по шаблону, здесь log-*, также снимается ограничение в один миллион документов на индекс.
Рассмотрим более подробный плагин вывода у Logstash:
output {
if [type] == "Info" {
elasticsearch {
claster => elasticsearch
action => "create"
hosts => ["localhost:9200"]
index => "log-%{+YYYY.MM.dd}"