kbook


Project maintained by atilla777 Hosted on GitHub Pages — Theme by mattgraham
Главная страница
ELK

Logstash

Общие сведения

Установка

При установке на 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 добавляет поля:

Каждая секция может содержать комбинацию используемых плагинов logstash.

Параметрами плагина (кодека) могут быть

Для ссылок на поля события

[поле]

Для вложенного поля [поле] [вложенное поле]

Поле @metadata позволяет хранить вложенные поля, которые не попадут на вывод logstash, а используются для определения логики работы плагинов, например можно добавить поле test

mutate { add_field => { "[@metadata][test]" => "Hello" } }

Конфигурация logstash поддерживает условные выражения:

if [поле] == [поле] {

  …

} else if {

  …

} else {

  …

}

Для преобразования форматов входных или выходных данных используются кодеки.

Формат файла конфигурации (pipeline)

# комментарий

input {
  кодеки
  плагины
}
filter {
  плагины
}
output {
  кодеки
  плагины
}

Настройка input

Основные кодеки

Использование кодека

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.

Настройка filter

Основные плагины

Фильтр grok

Grok плагин с помощью предопределённых паттернов разбивает событие на именованные поля, получая на выходе JSON формат. К этим полям могут обращаться другие плагины, например geoip.

grok {
  patterns_dir => "./patterns"
  match => {
  "message" => "%{патерн:имя} %{патерн:имя}"
  }
}

Синтаксис фильтра grok

%{паттерн:имя}

где

Паттерны можно определить в файле patterns/extra (путь к патерам задается директивой patterns_dir) в виде

ПАТТЕРН регулярное выражение

Пример

NUMBER \d+

Регулярные выражения grok

Регулярные выражения 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

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

Multilane – плагин фильтрации многострочных логов (в rails многострочные логи).

Фильтр mutate

mutate add_field remove_field convert

Плагин date – замена проставляемого logstash значения поля @timestamp на значение пользовательского поля (например ранее созданного с помощью gork)

date {
  match => [“поле”, “формат”]
}

где

Настройка output

Основные плагины

Вывод на консоль

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