При установке на linux сначала должна быть установлена подходящая версия Java RE
sudo apt-get install openjdk-8-jre
Установка выполняется согласно официальной документации.
Если Logstash был установлен с неправильной версией Java, его надо удалить (см. команду ниже), затем поставить нужную версию Java (см. пример выше), потом снова установить Logstash.
sudo apt-get install logstash
Запуск logstash
logstash agent –f конфигурация
Канал обработки данных (pipeline) logstash задается в конфигурационном файле и включает в себя следующие секции
Таким образом, проходящие через logstash данные обрабатываются в следующем порядке
источник событий -> кодек -> logstash{input->filter->output} -> кодек-> приемник
К каждому событию, обрабатываемому logstash он добавляет текущую дату и имя компьютера (агента logstash).
К каждому обрабатываемому событию logstash добавляет поля:
@version -
@timestamp - текущая дата.
message - само, обрабатываемое logstash, событие (запись в обрабатываемом файле).
Каждая секция может содержать комбинацию используемых плагинов logstash.
Параметрами плагина (кодека) могут быть
Для ссылок на поля события
[поле]
Для вложенного поля [поле] [вложенное поле]
Поле @metadata позволяет хранить вложенные поля, которые не попадут на вывод logstash, а используются для определения логики работы плагинов, например можно добавить поле test
mutate { add_field => { "[@metadata][test]" => "Hello" } }
Конфигурация logstash поддерживает условные выражения:
if [поле] == [поле] {
…
} else if {
…
} else {
…
}
Для преобразования форматов входных или выходных данных используются кодеки.
Формат файла конфигурации (pipeline)
# комментарий
input {
кодеки
плагины
}
filter {
плагины
}
output {
кодеки
плагины
}
Основные кодеки
Использование кодека
input {
stdin {
codec => multiline {
pattern => "<паттерн признака многострочного события>"
negate => "true" or "false"
what => "previous или next"
нода, }
}
}
Где
Основные плагины
Использование в качестве источника данных файлов (плагин file)
file {
path => "путь"
start_position => beginning
type => "тип события"
sincedb_path => "путь"
}
file {
…
Опция path => “путь” указывает путь к файлу (или файлам, в случае если происходит их ротация) который будет считываться logstash.
В имени файла можно использовать *.
на Windows путь указвается с прямыми слэшами - /путь/файл
Опция start_position => beginning указывает logstash считывать файл сначала, а не с текущей обновленной позиции (если в файл продолжает записываться информация). По умолчанию (без этой опции) будут считываться только вновь добавленные в файл строки (аналог tail –f0).
Для того, что бы при перезапуске logstash не потерять информацию о последней считанной из файла строке logstash ведет базу sinecdb.
Опция sincedb_path => ‘путь’ указывает путь к этому файлу.
Опция type => ‘тип’ добавляет к событию поле, имя которого может использоваться для обработки события далее в filter.
Основные плагины
Grok плагин с помощью предопределённых паттернов разбивает событие на именованные поля, получая на выходе JSON формат. К этим полям могут обращаться другие плагины, например geoip.
grok {
patterns_dir => "./patterns"
match => {
"message" => "%{патерн:имя} %{патерн:имя}"
}
}
Синтаксис фильтра grok
%{паттерн:имя}
где
Паттерны можно определить в файле patterns/extra (путь к патерам задается директивой patterns_dir) в виде
ПАТТЕРН регулярное выражение
Пример
NUMBER \d+
Регулярные выражения grok используют синтаксис Oniguruma.
Для помещения найденного с помощью паттерна значения в поле используется следующая конструкция:
(?<поле>патерн)
Исключить паттерн из результата
(?:паттерн)
Любой символ
.
Символ из группы
[символы]
Экранирование символа
\
Квантификаторы (указывают количество символов)
Ноль или один
?
Один или более
+
Ноль или более
*
Диапазон количества символов
{от, до}
Якоря (указывает расположение символов)
Начало строки
^
Конец строки
$
В файле с определением паттернов при определении регулярного выражения можно использовать ранее определенные паттерны
Предопределенные паттерны можно найти по ссылке или поиском в Google - **grok default patterns **
ПАТТЕРН %{ПАТТЕРН1} %{ПАТТЕРН2} %{ПАТТЕРН3}
Тут же можно определить какие поля будут добавлены в событие после обработки паттерна в logstash
ПАТТЕРН %{ПАТТЕРН1:поле} %{ПАТТЕРН2:поле}
То есть примирение паттерна в конфигурационном файле grok, при совпадении события (строки) с паттерном создаст определенные в паттерне поля (значения свойств JSON)
grok { match => {"mesasge" => "{ ПАТТЕРН }" } }
При конструировании регулярных выражений целесообразно использовать этот ресурс и (или) вот этим сайтом
В случае ошибки в паттернах, из-за которой logstash не сможет разобрать строку журнального файла, информацию об этом можно увидеть в переданном в Elasticsearch от Logstash JSON, в котором будет поле _grokparsefailure.
Так как grok парсит строки с помощью регулярных выражений, все полученные посредством него данные будут иметь тип строки.
Для числовых значений можно явно указать, какой тип данных помещается в поле
%{ПАТТЕРН1:поле:тип}
где тип это int или float
Для того, что бы указать ES, к какому типу относятся поля передаваемых ему объектов JSON, используется mapping.
Mapping позволяет выполнять в ES операции вычислений и агрегирования данных, а также улучшает производительность.
По умолчанию все поля попадающие из grok (logstash) в ES будут текстовыми (кроме @timestamp).
Для кастомизации mapping - его сначала надо выгрузить из ES (в ES уже должны быть соответствующие данные и, соответственно, индекс)
curl -XGET http://127.0.0.1:9200/<индекс>/_mapping?pretty > mapping.json
После чего в выгруженном JSON файле надо явно указать, каким типам соответствуют поля.
Например было
"<поле>" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
стало
"<поле>" : { "type" : "<тип>" }
Примеры поддерживаемых типов данных (необходимо выбирать наименьший из возможных типов данных)
При редактировании необходимо учитывать следующее.
Каждое поле имеет подтип и параметры типа.
В частности для текстового поля имеется параметр и подтип keyword с параметром “ignore_above” : 256, который говорит, что последовательность знаков не превышающая 256 символов будет рассматриаваться как одно ключевое слово (а не как несколько отдельных слов, разделитель которых пробел).
После редактирования выгруженного JSON файла из него необходимо сделать шаблон. Для этого первые строки в нем
{
"<индекс>" : {
"mappings" : {
"<тип>" : {
заменяются на следующие
{
"template" : "<индекс>*",
"version" : 50001,
"settings" : {
"index.refresh_interval" : "5s"
},
"mappings" : {
"_default_" : {
где
так как после этого в файле одна закрывающая скобка окажется лишней, то ее (например, предпоследнюю скобку внизу файла) необходимо удалить
Затем шаблон загружается в ES:
curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_template/<индекс>_template?pretty -d @<шаблон>.json
Подробнее про mapping можно почитать здесь
Multilane – плагин фильтрации многострочных логов (в rails многострочные логи).
mutate add_field remove_field convert
date {
match => [“поле”, “формат”]
}
где
Основные плагины
Вывод на консоль
stdout {}
Передача на elasticsearch (по HTTP):
elasticsearch {
}
Для указания адреса и порта хоста с elasticsearch
hosts => "хост:порт".
Индекс elasticsearch в который logstash передает дынные (документ) по умолчанию имеет вид – logstash-дата, то есть часть «дата» имени индекса определяется полем @timestamp события.
Если название индекса переопределить (опция плагина index => ‘индекс’), то в elasticsearch станут недоступны, автоматически создаваемые в logstash поля типа поле.raw.
Эти поля не анализируются (not-analyzed) в elasticsearch, то есть их содержимое будет представлять собой один целый терм (то есть “foo bar” останется самим собой, а не превратится в “foo” и “bar”).
Вывод в файл:
file {
path => 'out_file'
}