Как искать логи в kibana

Сервер логов Elasticsearch + Logstash + Kibana4 + Beats(windows/linux). Установка и настройка

Встал вопрос централизованного хранения и обработки журналов с серверов на базе Linux и Windows. Мой выбор пал на продукты от Elastic.
Большинство прочитанных статей на тему установки приложений Elastic показались мне достаточно расплывчатыми и неполными.

Основной и единственный источник информации, который я использовал: www.elastic.co/guide/index.html.

Этот мануал конечно не является исчерпывающим, но является достаточным для первоначальной установки и настройки рабочего лог-сервера elasticsearch+logtash+kibana4+beats (windows\linux-агенты).

Подробная информация, дополнительные возможности, а также «реал кунг-фу» доступны в официальной документации.

Будем собирать и склеивать

Подготовка

Редактируем hosts и hostname:

Устанавливаем Java 8:

Создаём каталоги, которые нам понадобятся для фасовки пакетов:

Идём на сайт www.elastic.co/downloads/elasticsearch и скачиваем актуальную (2.2.0) версию:

Редактируем конфиг /etc/elasticsearch/elasticsearch.yml:

Раскомментируем и отредактируем стоки cluster.name и node.name:

(вместо «elk-server.ss.lu» и «mynodename» можете вставьте свои значения)
Должно получится так:

cluster.name: elk-server.ss.lu
node.name: mynodename

Добавляем в автозагрузку:

Скачиваем актуальную (2.2.0) версию Logstash www.elastic.co/downloads/logstash и устанавливаем:

Создаём INPUT-файл для «битсов»…

… и копируем туда код:

Это будет означать что logstash начнёт слушать порт 5044. Данный порт является по умолчанию для этой версии и будет прописан по умолчанию в битсах. Можете задать любой другой.

… и копируем туда код для связи с elasticsearch:

Проверяем конфиг на ошибки, запускаем, и вносим в автозапуск:

Пример успешной работы:

Скачиваем и устанавливаем публичный ключ:

Обновляем репозиторий и устанавливаем:

Как искать логи в kibana. ecd14028d7d1c77365ff4e325a824b12. Как искать логи в kibana фото. Как искать логи в kibana-ecd14028d7d1c77365ff4e325a824b12. картинка Как искать логи в kibana. картинка ecd14028d7d1c77365ff4e325a824b12

Нас просят создать первый индекс, но мы пока оставляем всё как есть и переходим к настройке клиентов.

Ставим на клиенты. Для начала, на сервер скачаем и поставим несколько готовых дашбордов Kibana с индексами Beats:

И видим что были добавлены дашборды Kibana с индексами Beats:

Как искать логи в kibana. 38d7a936c0fa8e2c1bfbe7ac95a7e8b5. Как искать логи в kibana фото. Как искать логи в kibana-38d7a936c0fa8e2c1bfbe7ac95a7e8b5. картинка Как искать логи в kibana. картинка 38d7a936c0fa8e2c1bfbe7ac95a7e8b5

Получение данных об инфраструктуре сервера.
Передаёт информацию о работе процессора, использованию памяти. Для каждого процесса отображается информации о родители, pid, состояние и т.д. Также Topbeat позволяет просматривать информацию о файловой системе — состояние дисков, объём свободного пространства и т.д.

Установка (на клиенте):

На сервер нужно добавить шаблоны индексов Topbeat чтобы Elasticsearch стал правильно анализировать информацию на входе:

При успешной загрузки мы должны увидеть:

Редактируем конфиг (на клиенте):

В блоке output нужно за комментировать обращение к elasticsearch, т.к мы будем использоватеть logstash:

Раскомментируем блок с Logstash, укажем его IP-адресс и порт:

Важно: не используйте табуляцию для передвижения курсора в конфиге! Только пробелы. Иначе получите ошибку:

Если сервер Logstash находится во внешней сети, то на фаерволле удалённого сервера нужно настроить форвардиг порта, в данном случаем 5044 (tcp/udp).
Дополнительные опции логирования хорошо описаны в конфигах.

Открываем интерфейс Kibana и наблюдаем поступающую информацию:

Как искать логи в kibana. image loader. Как искать логи в kibana фото. Как искать логи в kibana-image loader. картинка Как искать логи в kibana. картинка image loader

Транслирует на сервер информацию из динамических файлов, которые мы будем указывать:

Добавим индексы на сервере (по аналогии с как мы настраивали Topbeat. Т.е. если на сервере шаблон отсутствует — мы его создаём):

Указываем то, что нужно нам на данном клиенте, например:

Помните про отсутствие табуляции в коде!

Мы также будем использовать logstash для обработки индексов:

Смотрим информацию от Filebeat:

Как искать логи в kibana. image loader. Как искать логи в kibana фото. Как искать логи в kibana-image loader. картинка Как искать логи в kibana. картинка image loader

Очень полезный инструмент. Анализирует трафик между серверами. Моментально выявляет ошибки. Анализирует протоколы DNS, HTTP, MySQL, PostgreSQL, КЗС, Memcache и другие.

Настраивается по той же аналогии что и Topbeat/Filebeat:

Редактируем кофиг (комментируем Elasticsearch и настраиваем Logstash)
output:

Идём на сервер и добавляем индекс для Packetbeat:

Скачиваем www.elastic.co/downloads/beats/winlogbeat. Распаковываем в C:\ и переименовываем в Winlogbeat. Запускаем PowerShell от админа и устанавливаем сервис:

Если мы видим сообщение о том что скрипты отключены в системе по умолчанию (а так оно и будет), то мы просто создаём политику для Winlogbeat:

Перед стартом сервиса правим в конфиге — C:\Winlogbeat\winlogbeat.yml.

В блоку event_logs перечислены основные журналы системы, которые нужно транспортировать на Logstash:

В event_logs можно добавить и другие журналы, список которых можно посмотреть так:

Если система выше Vista, то можно указать каналы:

Далее нам нужно загрузить на сервер индексы для winlogbeat как мы это делали для topbeat, filebeat, packetbeat. Это можно сделать удалённо:

Есть есть проблемы такого метода, то можно сделать следующее:

Создаём на сервере файл индекса winlogbeat.template.json
sudo vi

/ELK/releases/beats/winlogbeat/winlogbeat.template.json. На клиенте Windows открываем файл C:\winlogbeat\winlogbeat.template.json и копируем его содержимое в файл

Далее (на сервере) загружаем этот индекс на elasticsearch, для того чтобы он смог верно проанализировать информацию и предоставить её привычном формате:
Переходим в каталог где у нас лежит созданный файл winlogbeat.template.json.

На выходе должно быть:

<"acknowledged":true>

Идём на клиент и запускаем сервис winlogbeat. После это начинаем мониторить данные через Kibana, определяя представление по загруженным индексам:

Как искать логи в kibana. 92e061016dbb8c1b27795fc74a808099. Как искать логи в kibana фото. Как искать логи в kibana-92e061016dbb8c1b27795fc74a808099. картинка Как искать логи в kibana. картинка 92e061016dbb8c1b27795fc74a808099

Как искать логи в kibana. 6ff08246a2948ff08fc89aa220121396. Как искать логи в kibana фото. Как искать логи в kibana-6ff08246a2948ff08fc89aa220121396. картинка Как искать логи в kibana. картинка 6ff08246a2948ff08fc89aa220121396

Удаление всех индексов:

Вместо * можно указать неугодный индекс, например:

Для удаление старых логов не обходимо установить «питоновский» модуль:

Если pip не установлен, то устанавливаем:

Посмотерть статус работы Elasticsearch:

Этого достаточно чтобы запустить полноценный лог-сервер, раскидать на клиенты транспортёры и понять принципы.

Дополнительные настройки (оптимизация, настройки geoip и т.д.) описаны в официальной документации и конфигах.

Источник

Русские Блоги

Кибана: как использовать панель поиска

Как искать

В панели поиска Kibana есть три способа поиска:

Как искать логи в kibana. fea5072ca96e8d2d125befbf2b27379b. Как искать логи в kibana фото. Как искать логи в kibana-fea5072ca96e8d2d125befbf2b27379b. картинка Как искать логи в kibana. картинка fea5072ca96e8d2d125befbf2b27379b

Как искать логи в kibana. facf7e1cb02fa66490494dc16f8c51c9. Как искать логи в kibana фото. Как искать логи в kibana-facf7e1cb02fa66490494dc16f8c51c9. картинка Как искать логи в kibana. картинка facf7e1cb02fa66490494dc16f8c51c9

Когда мы выключаем переключатель KQL, он становится следующим:

Как искать логи в kibana. 2ee7d85810c39fc9b20adb84c0587fb8. Как искать логи в kibana фото. Как искать логи в kibana-2ee7d85810c39fc9b20adb84c0587fb8. картинка Как искать логи в kibana. картинка 2ee7d85810c39fc9b20adb84c0587fb8

Ниже мы опишем, как использовать их для нашего поиска отдельно.

Что такое шаблон индекса?

Шаблон индекса: он указывает на один или несколько индексов Elasticsearch и сообщает Kibana, с какими индексами работать.

Как искать логи в kibana. 42df79bbc3be8d7611fb3e3676ee86c2. Как искать логи в kibana фото. Как искать логи в kibana-42df79bbc3be8d7611fb3e3676ee86c2. картинка Как искать логи в kibana. картинка 42df79bbc3be8d7611fb3e3676ee86c2

тип данных

Для Elasticsearch существует два типа данных, которые можно анализировать:

Когда мы создаем наш собственный шаблон индекса, нам нужно выбрать наш тип данных:

Как искать логи в kibana. f1b67b968315993a84b115e03673b6eb. Как искать логи в kibana фото. Как искать логи в kibana-f1b67b968315993a84b115e03673b6eb. картинка Как искать логи в kibana. картинка f1b67b968315993a84b115e03673b6eb

Как искать логи в kibana. becec9a7de90b1b2df5e6b7b17197677. Как искать логи в kibana фото. Как искать логи в kibana-becec9a7de90b1b2df5e6b7b17197677. картинка Как искать логи в kibana. картинка becec9a7de90b1b2df5e6b7b17197677

Как искать логи в kibana. 791b5ba1b493db22433d87809bfab372. Как искать логи в kibana фото. Как искать логи в kibana-791b5ba1b493db22433d87809bfab372. картинка Как искать логи в kibana. картинка 791b5ba1b493db22433d87809bfab372

Выше мы должны ввести соответствующий шаблон индекса в соответствии с именем нашего собственного индекса. Он может указывать на один индекс или на несколько индексов через символы подстановки. Если ваш индекс содержит поля, относящиеся ко времени, Kibana автоматически отобразит опцию, позволяющую нам выбрать, нужен ли Time Filter:

Как искать логи в kibana. 4ef76e4bf0d2c1c0e2d89cc6cf1e7678. Как искать логи в kibana фото. Как искать логи в kibana-4ef76e4bf0d2c1c0e2d89cc6cf1e7678. картинка Как искать логи в kibana. картинка 4ef76e4bf0d2c1c0e2d89cc6cf1e7678

Если мы выберем поле Time Filter, оно будет обработано в соответствии с методом временных рядов. В противном случае мы можем отказаться от использования фильтра времени, тогда мы можем только искать в индексе и не выполнять операции, связанные с временным рядом. Ввиду этой ситуации средство выбора времени, которое мы представляем ниже, больше не будет применяться.

Если мы хотим удалить шаблон индекса, мы также можем выбрать удаление на странице выше:

Как искать логи в kibana. 71d102c4e45b8fb668f8a27ca3e65b20. Как искать логи в kibana фото. Как искать логи в kibana-71d102c4e45b8fb668f8a27ca3e65b20. картинка Как искать логи в kibana. картинка 71d102c4e45b8fb668f8a27ca3e65b20

Подготовить данные

Мы можем использовать данные, поставляемые с Kibana, для демонстрации. Мы загружаем данные следующим образом:

Как искать логи в kibana. 4fff3f9f6df7ff836e8efc30116e34c3. Как искать логи в kibana фото. Как искать логи в kibana-4fff3f9f6df7ff836e8efc30116e34c3. картинка Как искать логи в kibana. картинка 4fff3f9f6df7ff836e8efc30116e34c3

Выбрать»Add sample data”:

Как искать логи в kibana. 7eb37754b49a4004bc17370514b27b9c. Как искать логи в kibana фото. Как искать логи в kibana-7eb37754b49a4004bc17370514b27b9c. картинка Как искать логи в kibana. картинка 7eb37754b49a4004bc17370514b27b9c

Мы выбираем»Add datamsgstr «, чтобы мы могли загрузить нужные нам образцы данных в Elasticsearch.

Прежде чем искать, мы должны понять две важные вещи:

Как искать логи в kibana. fca9c7d38908ad706254a2c186cf2112. Как искать логи в kibana фото. Как искать логи в kibana-fca9c7d38908ad706254a2c186cf2112. картинка Как искать логи в kibana. картинка fca9c7d38908ad706254a2c186cf2112

Кибана поиск

Давайте сначала посмотрим на документ, проиндексированный нашими kibana_sample_data_flights.

Как я упоминал выше, мы сначала выбираем наш индекс, а затем устанавливаем время, соответствующее нашему методу времени.

Как искать логи в kibana. 221ea8e3ab9672e52d5b66c3cd94a3bf. Как искать логи в kibana фото. Как искать логи в kibana-221ea8e3ab9672e52d5b66c3cd94a3bf. картинка Как искать логи в kibana. картинка 221ea8e3ab9672e52d5b66c3cd94a3bf

KQL способ поиска:

Как искать логи в kibana. cda2e613041af5c12e0b12b5b16757cc. Как искать логи в kibana фото. Как искать логи в kibana-cda2e613041af5c12e0b12b5b16757cc. картинка Как искать логи в kibana. картинка cda2e613041af5c12e0b12b5b16757cc

Выше мы видим, что когда мы используем KQL, большое преимущество заключается в том, что он может помочь нам автоматически запрашивать поля, которые мы хотим найти. Например, когда мы наступим на следующий день, Kibana автоматически откроет варианты, чтобы мы могли выбрать.

Мы даже можем напечатать нужную строку, например Baidu, без использования специального поля:

Как искать логи в kibana. 2aa11f166b7c0fa6919acb05f36c9e5d. Как искать логи в kibana фото. Как искать логи в kibana-2aa11f166b7c0fa6919acb05f36c9e5d. картинка Как искать логи в kibana. картинка 2aa11f166b7c0fa6919acb05f36c9e5d

Мы также можем использовать шаблоны для выполнения нечетких поисков:

Как искать логи в kibana. 97c965032507253170ce7193d1ec9614. Как искать логи в kibana фото. Как искать логи в kibana-97c965032507253170ce7193d1ec9614. картинка Как искать логи в kibana. картинка 97c965032507253170ce7193d1ec9614

Кавычки вокруг поискового запроса инициируют поиск по фразе. Например, сообщение «Быстрый коричневый лис» будет искать фразу «быстрый коричневый лис» в поле сообщения. Без кавычек ваш запрос будет разбит на токены анализатором, настроенным в поле сообщения, и будет сопоставлять документы, содержащие эти токены, независимо от порядка их появления. Это означает, что документы с «быстрой коричневой лисой» будут совпадать, но «быстрая коричневая лиса» также будет совпадать. Если вы хотите найти фразу, не забудьте использовать кавычки. При поиске фразы порядок каждого токена очень важен.

Анализатор запросов больше не будет разбиваться на пустое пространство. Несколько поисковых терминов должны быть разделены явными логическими операторами. Lucene объединяет условия поиска с или по умолчанию. Эти логические операторы являются или, и не и.

Как искать логи в kibana. 5faf0fafcf68af29cc958d6bb3fe2e1b. Как искать логи в kibana фото. Как искать логи в kibana-5faf0fafcf68af29cc958d6bb3fe2e1b. картинка Как искать логи в kibana. картинка 5faf0fafcf68af29cc958d6bb3fe2e1b

Вышеуказанный поиск вернет все документы, для которых dayofWeek равен 1 или OriginCountry имеет значение «DE». Если мы хотим искать документы, которые удовлетворяют обоим этим условиям, мы можем использовать и

Как искать логи в kibana. 347364b19599515dd237fad0a0fbb5d5. Как искать логи в kibana фото. Как искать логи в kibana-347364b19599515dd237fad0a0fbb5d5. картинка Как искать логи в kibana. картинка 347364b19599515dd237fad0a0fbb5d5

Очевидно, в это время мы видели только 23 документа, намного меньше, чем раньше. Мы также можем использовать, чтобы не возвращать неоперации. Например, если мы хотим получить все документы, где OriginCountry не является DE, мы можем напрямую искать не OriginCountry: «DE»

Как искать логи в kibana. fcd490ca70e2c0139b28a6ef368adb8f. Как искать логи в kibana фото. Как искать логи в kibana-fcd490ca70e2c0139b28a6ef368adb8f. картинка Как искать логи в kibana. картинка fcd490ca70e2c0139b28a6ef368adb8f

Мы также можем искать поле по диапазону, например:

Как искать логи в kibana. 0fe49ffc37065839681c4dd7b581195a. Как искать логи в kibana фото. Как искать логи в kibana-0fe49ffc37065839681c4dd7b581195a. картинка Как искать логи в kibana. картинка 0fe49ffc37065839681c4dd7b581195a

Поиск Lucene:

Чтобы иметь возможность искать в режиме Lucene, мы должны переключиться в режим Lucence. Таким образом, когда мы вводим поле в поле ввода без запроса, мы не можем помочь нам завершить ввод автоматически.

Как искать логи в kibana. ec4892cf4da4b5fad1ad1cf8b20c0c40. Как искать логи в kibana фото. Как искать логи в kibana-ec4892cf4da4b5fad1ad1cf8b20c0c40. картинка Как искать логи в kibana. картинка ec4892cf4da4b5fad1ad1cf8b20c0c40

Мы можем искать ряд документов:

Как искать логи в kibana. b674ed756585cc04f63bc90371d6e585. Как искать логи в kibana фото. Как искать логи в kibana-b674ed756585cc04f63bc90371d6e585. картинка Как искать логи в kibana. картинка b674ed756585cc04f63bc90371d6e585

Выше, если мы не хотим включать 3, мы должны написать: dayOfWeek: [0 TO 3>. Вы также можете написать любое значение от 3 и выше:

Как искать логи в kibana. 5466d691def2611721d7230705aa5493. Как искать логи в kibana фото. Как искать логи в kibana-5466d691def2611721d7230705aa5493. картинка Как искать логи в kibana. картинка 5466d691def2611721d7230705aa5493

Мы также можем выполнить поиск всех документов, для которых OriginCountry является США или DE, в соответствии со следующим методом.

Как искать логи в kibana. 84349db8566a0c17183966e67111549b. Как искать логи в kibana фото. Как искать логи в kibana-84349db8566a0c17183966e67111549b. картинка Как искать логи в kibana. картинка 84349db8566a0c17183966e67111549b

Или нечеткий запрос:

Как искать логи в kibana. 16a95d7572a0525eb6a51524bc1d11e4. Как искать логи в kibana фото. Как искать логи в kibana-16a95d7572a0525eb6a51524bc1d11e4. картинка Как искать логи в kibana. картинка 16a95d7572a0525eb6a51524bc1d11e4

Или только одна правкаНечеткий запрос:

Как искать логи в kibana. 53789799a3ab0ac1412d949b7828311c. Как искать логи в kibana фото. Как искать логи в kibana-53789799a3ab0ac1412d949b7828311c. картинка Как искать логи в kibana. картинка 53789799a3ab0ac1412d949b7828311c

Вы также можете использовать подстановочные знаки? Чтобы соответствовать любому письму (обратите внимание, что это не доступно в KQL):

Как искать логи в kibana. edaae3e315488186fe04d8062c8706c4. Как искать логи в kibana фото. Как искать логи в kibana-edaae3e315488186fe04d8062c8706c4. картинка Как искать логи в kibana. картинка edaae3e315488186fe04d8062c8706c4

Как искать логи в kibana. d30404f3c8780efc7535e33903b46909. Как искать логи в kibana фото. Как искать логи в kibana-d30404f3c8780efc7535e33903b46909. картинка Как искать логи в kibana. картинка d30404f3c8780efc7535e33903b46909

Точно так же мы можем использовать обычный запрос, чтобы иметь 0 или 1 букву:

Как искать логи в kibana. bc7d672a7a8c439d291ad3ffff68060e. Как искать логи в kibana фото. Как искать логи в kibana-bc7d672a7a8c439d291ad3ffff68060e. картинка Как искать логи в kibana. картинка bc7d672a7a8c439d291ad3ffff68060e

Вы также можете использовать. * Обычный, чтобы соответствовать 0 или более букв:

Источник

Просмотр архивных логов apache c помощью Logstash+Elastisearch+Kibanа

Нет так давно передо мной встала задача пробежаться по старым логам apache. Надо было сделать выборку по нескольким IP адресам, отыскать некоторые аномалии и попытки SQL-injection’ов. Логов было не так много, порядка миллиона строк и можно было спокойно всё сделать стандартным набором grap-awk-uniq-wc итд.

Поскольку я уже какое-то (больше года) время пользуюсь связкой Logstash-Elasticsearch-Kibana для анализа-просмотра всевозможных логов, то решил ей воспользоваться и в данной ситуации.

Краткое описание основных компонентов системы.

Logstash — бесплатная open-source программа на java для сбора и нормализации логов. Может принимать логи либо с локальных файлов, либо через tcp/udp порты. На момент написания статьи, разных входных (input) фильтров насчитывается 26. Есть даже входной модуль, для сбора сообщений из twitter’а или irc.

Elasticsearch — бесплатный open-source поисковый сервер основанный на Apache Lucene. Быстрый, легко настраиваемый и очень масштабируемый.

Kibana — веб-интерфейс написанный на ruby, для отображения данных из Elasticsearch. Простая настройка, но множество функций — поиск, графики, stream.

1. Elasticsearch

1.1 Скачиваем Elasticsearch (размер 16MB):
Важно заметить, что для Logstash версии 1.1.9 Elasticsearch должен быть именно версии 0.20.2.
# wget download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.2.tar.gz

1.3 По большому счёту можно запускать Elasticsearch и с заводскими настройками. Но я всё же меняю некоторые параметры.
Заходим любимым текстовым редакторов в файл настроек:
# vi elasticsearch-0.20.2/config/elasticsearch.yml

Список моих изменений для standalone решения:Перед запуском Elasticsearch убедитесь, что каталоги прописанные в path.data, path.work и path.logs существуют.

Если на вашем сервере появились два tcp порта 9200 и 9300 в режиме LISTEN, то это значит Elasticsearch готов к работе.

2. Logstash

2.1 Скачиваем свежую версию Logstash 1.1.9 (размер 60MB)
# wget logstash.objects.dreamhost.com/release/logstash-1.1.9-flatjar.jar

2.2 Создаём конфигурационный файл (apache.conf) для принятия архивных логов apache, их нормализации и занесением в базу Elasticsearch:

Краткое описание некоторых параметров:
В нашем случае Logstash будет слушать на tcp порту 3338. На него мы будем посылать netcat’м логи apache.

указываем название кластера, которое мы прописали в cluster.name: в настройках Elasticsearch

ip адрес на котором бегает Elasticsearch

в моём случае суточных логов apache не так много около 40000, поэтому месячного индекса достаточно. Если же логов в сутки по 500000 или больше, тогда уместнее создать суточный индекс «apache-%<+YYYY.MM.dd>»

2.5 Пока идёт процесс закачивания логов, можно проверить попадают ли данные в базу Elasticsearch.
Для этого в браузере введите elasticsearch_ip:9200/_status?pretty=true, если вы найдёте там строки подобные этой:
значит всё работает как и требовалось.

3. Kibana

3.2 Конфигурация Kibana
# vi KibanaConfig.rb
Настройки, которые возможно потребуют изменений:

3.3 Запуск Kibana
# ruby kibana.rb

После успешного запуска, на экране делжен появиться подобный текст:

Источник

Система сбора, анализа, уведомлений и визуализации логов на syslog-ng, elasticsearch, kibana, grafana, elasticalert

Как искать логи в kibana. 13ae7c066bfa702c18be12a52737ae7d. Как искать логи в kibana фото. Как искать логи в kibana-13ae7c066bfa702c18be12a52737ae7d. картинка Как искать логи в kibana. картинка 13ae7c066bfa702c18be12a52737ae7d

Что мы получим после этой статьи:

Систему сбора и анализа логов на syslog-ng, elasticsearch в качестве хранилища данных, kibana и grafana в качестве систем визуализации данных, kibana для удобного поиска по логам, elasticalert для отправки уведомлений по событиям. Приготовьтесь, туториал объемный.

Какие логи будем собирать:

Обоснование выбора системы

Почему я выбрал связку с syslog-ng в качестве отправителя, парсера и приемщика логов? Да потому что он очень быстрый, надежный, не требовательный к ресурсам(да да — logstash в качестве агентов на серверах и виртуальных машинах просто убожество в плане пожирания ресурсов и требованием java), с внятным синтаксисом конфигов(вы видели rsyslog? — это тихий ужас), с широкими возможностями — парсинг, фильтрация, большое количество хранилищ данных(postgresql,mysql,elasticsearch,files и т.д.), буферизация(upd не поддерживает буферизацию), сторонние модули и другие фишки.

Требования:

Приступим или добро пожаловать под кат

Небольшое пояснение.
Только кластер elasticsearch можно использовать в production, система из одной ноды просто загнется. В production используем кластер из master ноды и нескольких датанод. Отказоустойчивый кластер здесь рассматривать не будем. Кому интересно — вперед гуглить. Elastic рекомендует использовать одинаковую конфигурацию для нод кластера, так как кластер все равно будет работать со скоростью самой медленной ноды. Я использую ноды по 4 cpu и 12 gb озу и 700 gb ssd.

Наша система логов будет состоять из нескольких виртуальных машин — головного сервера(elasticnode1) и датанод elasticsearch(elasticnode2-9), на которых будут только храниться данные.

Сразу поправим файл /etc/hosts, если у вас нет настроенного dns сервера.

Меняем планировщика — у нас же ssd

Компоненты головного сервера
(elasticnode1):

Компоненты отправителей логов:

На данный момент появилась версия 6 продуктов elasticsearch, kibana и т.д., я же в production использую 5.6.3 — пока не было возможности мигрировать на последнюю версию.

Настраиваем отправители логов.

Устанавливаем syslog-ng последней версии. Ставить будем из репозитория. Здесь установка для Ubuntu 16.04.

Источник

Kibana-мать или Зачем вам вообще нужны логи?

Вы можете сказать, что “иногда бывает нужно. ” Но на самом деле, вы хотите всегда видеть, что у вас в логах, через графический интерфейс. Это позволяет:

Такой use case обещает наполнить вашу жизнь совершенно новыми красками и заставит испытать полную гамму чувств.

Как искать логи в kibana. b61bc487a1c24e039bcf7a91b51807ed. Как искать логи в kibana фото. Как искать логи в kibana-b61bc487a1c24e039bcf7a91b51807ed. картинка Как искать логи в kibana. картинка b61bc487a1c24e039bcf7a91b51807ed

Пролог:

«Пойми, на Хабрахабре только и разговоров, что о Kibana и Elasticsearch. О том, как это чертовски здорово — наблюдать, как огромный текстовый лог превращается в красивые графики, а еле видимая нагрузка на CPU горит где-то в глубине top-а. А ты. Что ты им скажешь?»

Матчасть

В жизни каждого нормального пацана возникает момент, когда он решил-таки поставить на своем проекте связку ELK.

Схема среднестатистического пайплайна выглядит примерно так:
Как искать логи в kibana. image loader. Как искать логи в kibana фото. Как искать логи в kibana-image loader. картинка Как искать логи в kibana. картинка image loader

Мы шлём в Kibana 2 вида логов:

Описываем пути к файлам и добавляем к сообщениям поля, которые нам понадобятся для определения типов логов на этапе фильтрации и при отправке в ES.

В зависимости от формата, прогоняем его через соответствующий кодек.

В случае с nginx, это будут вот такие “необычные” регулярки-полуфабрикаты, предлагаемые фильтрующим модулем “grok” (слева), и названия полей, в которые попадут заматченые данные (справа). Для пущей красоты у нас есть еще фильтр geoip, который определяет локацию клиента. В Кибане можно будет сделать “географию” клиентов. Базу качаем отсюда dev.maxmind.com/geoip/legacy/geolite.

А в случае с json, как видите, ничего делать вообще не надо, что не может не радовать.

Имя индекса и document_type для ES берем из полей, которые в самом начале пути приклеили к сообщениям в filebeat-е.

Связывание событий в логах фронта и бэка

Завязка:

“У нас было 2 типа логов, 5 сервисов в стэке, полтерабайта данных в ES, а также несчетное множество полей в логах приложений. Не то чтобы это был необходимый набор для риалтайм-анализа состояния сервиса, но когда начинаешь задумываться еще и о связывании событий nginx-а и приложения, становится сложно остановиться.

Единственное, что вызывало у меня опасения — Lua. Нет ничего более беспомощного, безответственного и порочного, чем Lua в конфигах Nginx. Я знал, что рано или поздно мы перейдем и на эту дрянь”.

Как искать логи в kibana. image loader. Как искать логи в kibana фото. Как искать логи в kibana-image loader. картинка Как искать логи в kibana. картинка image loader

Для генерации request-id на Nginx-е будем использовать Lua-библиотеку, которая генерирует uuid-ы. Она, в целом, справляется со своей задачей, но пришлось немного доработать ее напильником — ибо в первозданном виде она (та-дам!) дуплит uuid-ы.

На выходе получаем возможность по событию в логе приложения найти повлекший его запрос, прилетевший на Nginx. И наоборот.

Довольно быстро обнаружилось, что наши “вселенски-уникальные” айдишники не такие уж уникальные. Дело в том, что randomseed библиотека берет из таймстампа на момент запуска nginx-воркера. А воркеров у нас столько, сколько ядер у процессора, и запускаются они одновременно… Не беда! Подмешаем туда pid воркера и будет нам счастье:

P.S. В репозитарии Debian-а есть готовый пакет nginx-extras. Там сразу есть Lua и еще куча полезных модулей. Рекомендую, вместо того чтобы вкомпиливать модуль Lua руками (еще бывает openresty, но я не пробовал).

Группировка ошибок по частоте возникновения.

Kibana позволяет группировать (строить рейтинги) событий на основе одинаковых значений полей.

В логе ошибок у нас есть стэктрейсы, они почти идеально подходят в качестве ключа группировки, но загвоздка в том, что в Кибане нельзя группировать по ключам длиннее 256 символов, а стэки конечно длиннее. Поэтому мы делаем md5-хэши стэктрейсов в bunyan и группируем уже по ним. Красота!

Так выглядит топ 20 ошибок:
Как искать логи в kibana. image loader. Как искать логи в kibana фото. Как искать логи в kibana-image loader. картинка Как искать логи в kibana. картинка image loader

И отдельно взятый тип ошибки на графике и списком эпизодов:
Как искать логи в kibana. image loader. Как искать логи в kibana фото. Как искать логи в kibana-image loader. картинка Как искать логи в kibana. картинка image loader

Теперь мы знаем, какой баг в системе можно пофиксить когда-нибудь потом, т.к. он слишком редкий. Согласитесь, такой подход куда научнее, чем “за эту неделю было много подобных тикетов в саппорт”.

А теперь — срыв покровов: оно работает, но плохо

Кульминация:

«Я понимаю. Ты нашёл в NoSQL рай: у тебя быстро шла разработка, ведь ты хранил все в MongoDB, и тебе не нужны были такие друзья, как я. А теперь, ты приходишь и говоришь: мне нужен поиск. Но ты не просишь с уважением, ты даже не называешь меня Лучшим Поисковым Движком. Нет, ты приходишь ко мне в дом в день рождения Lucene и просишь меня индексировать неструктурированные логи бесплатно»

Как искать логи в kibana. image loader. Как искать логи в kibana фото. Как искать логи в kibana-image loader. картинка Как искать логи в kibana. картинка image loader

Неожиданности
Все ли сообщения из лога попадают в Кибану?

Нет. Не все попадают.

Маппинг запоминает название поля и его тип (число, строка, массив, объект и т.д.). Если мы посылаем в ES сообщение, в котором есть поле, уже существующее в маппинге, но тип не совпадает с тем, что было в этом поле раньше (например, в маппинге — массив, а пришел объект), то такое сообщение не попадет в ES, а в его логе будет не слишком очевидное сообщение:

Имена полей в json-логах

Elasticsearch v2.x не принимает сообщения, в которых есть поля, имена которых содержат точки. В v1.x этого ограничения не было, и мы не можем перейти на новую версию, не переделав все логи, т.к. у нас такие поля уже “исторически сложились”.
Источник

Кроме того, в Kibana не поддерживаются поля имена которых начинаются с подчеркивания ‘_’.
Как искать логи в kibana. image loader. Как искать логи в kibana фото. Как искать логи в kibana-image loader. картинка Как искать логи в kibana. картинка image loader

Автоматическое уползание данных в соседние инстансы ES

По-умолчанию в ES включена опция Zen Discovery. Благодаря ей, если вы запустите несколько инстансов ES в одной сети (например, несколько докер-контейнеров на одном хосте), то они друг друга найдут и поделят данные между собой. Очень удобный способ смешать продуктивные и тестовые данные и долго с этим разбираться.

Оно падает и потом долго поднимается. Это еще больнее, когда docker

Реже, но тоже бывает, что падает Elasticsearch. Делает он это “по-английски” (т.е. молча).

Чтобы понять, кто из них двоих упал, делаем http-запрос в ES — если ответил, значит лежит не он. Кроме того, когда у вас относительно много данных (скажем, 500G), то ваш Elasticsearch после запуска будет еще около получаса просасывать эти данные, и в это время они будут недоступны. Данные самой Kibana хранятся там же, поэтому она тоже не работает, пока ее индекс не подхватится. По закону подлости, до нее обычно очередь доходит в самом конце.

Приходится мониторить мониторингом длину очереди в rabbitmq, чтобы оперативно реагировать на инциденты. Раз в неделю они стабильно случаются.

А когда у вас всё в docker-е, и контейнеры слинкованы между собой, то вам нужно перезапустить еще и все контейнеры которые были слинкованы с контейнером ES, кроме него самого.

Большие дампы памяти при OOM

30GB. Сбрасываются они, разумеется, в директорию, где лежат бинарники (а не туда, где данные). Происходит это быстро, мониторинг даже не успевает прислать смс-ку. Отключить это поведение можно в bin/elasticsearch.in.sh.

Производительность

В Elasticsearch существует т.н. “маппинг” индексов. По-сути, это схема таблицы, в которой хранятся данные в формате “поле — тип”. Создается она автоматически на основе поступающих данных. Это значит, что ES запомнит имя и тип данных поля, исходя из того, данные какого типа пришли в этом поле в первый раз.

Например, у нас есть 2 очень разных лога: access-log nginx и production-log nodejs-приложения. В одном стандартный набор полей, он короткий, типы данных никогда не меняются. В другом же, напротив, полей много, они nested, они свои у каждой строчки лога, названия могут пересекаться, данные внутри полей могут быть разных типов, длина строки доходит до 3 и более Mб. В итоге автомаппинг ES делает так:

В общем, оно сильно тормозит как при индексации данных, так и при поиске через Kibana. При этом, чем больше накопилось данных, тем хуже.

Мы пытались бороться с этим закрытием старых индексов c помощью curator. Положительный эффект безусловно есть, но все-таки это анестезия, а не лечение.

Поэтому мы придумали более радикальное решение. Весь тяжелый nested-json в production-логе отныне будет логироваться в виде строки в специально-отведенном одном поле сообщения. Т.е. вот прямо JSON.stringify(). За счет этого набор полей в сообщениях становится фиксированным и коротким, мы приходим к “легкому” маппингу как у nginx-лога.

Конечно, это своего рода “ампутация с дальнейшим протезированием”, но вариант рабочий. Будет интересно увидеть в комментариях, как еще можно было сделать.

Промежуточный итог

Стэк ELK — классный инструмент. Для нас он стал просто незаменимым. Менеджеры следят за всплесками ошибок на фронтэнде после очередного релиза и приходят жаловаться к разработчикам уже “не с пустыми руками”. Те, в свою очередь, находят корреляции с ошибками в приложении, сразу видят их стэки и прочие важнейшие данные, необходимые для дебага. Есть возможность моментально строить различные отчеты из серии “хиты по доменам сайтов” и т.п. Словом, непонятно как мы жили раньше. Но с другой стороны…

“Robust, Reliable, Predictable” — все это не про ELK. Cистема очень капризная и богатая на неприятные сюрпризы. Очень уж часто приходится копаться во всем этом шатком, извините, Jav-не. Лично я не могу припомнить технологию, которая бы так плохо следовала принципу “настроил и забыл”.

Поэтому за последние 2 месяца мы полностью переделали логи приложения. Как в плане формата (избавляемся от точек в именах, чтобы перейти на ES v.2), так и в плане подхода к тому, что вообще логировать а что нет. Сам по себе этот процесс, имхо, абсолютно нормальный и логичный для такого проекта, как наш — недавно uKit отпраздновал свой первый день рождения.

«В начале пути вы сваливаете в логи как можно больше инфы, т.к. заранее неизвестно, что понадобится, а потом, начав „взрослеть“, постепенно убираете лишнее». (c. pavel_kudinov)

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *