Fluentd: быстрый поиск логов с Elasticsearch, Kibana and Fluentd

Автор:human

Fluentd: быстрый поиск логов с Elasticsearch, Kibana and Fluentd

Fluentd: быстрый поиск логов с Elasticsearch, Kibana and Fluentd.

Es_ki_fl

Содержание:

  1. Введение
    2. Вариант 1 — реализация через fluentd agregator+fluentd forwarders
    2.1 Установка Elasticsearch
    2.2 Установка Kibana
    2.3 Установка Fluentd
    2.3 Настройка отправителей логов(fluentd-senders) во fluentd agregator
    3. Вариант 2 —  Rsyslog nodes > Rsyslog Agregator+fluentd+elasticsearch+kibana
    4 Использование системы
    5 Заключение

1 Введение.

Elasticsearch(версии 2.3): Elasticsearch является гибким и мощным решением с открытым исходным кодом, задачей которой является распространение, поиск в реальном времени и аналитика полученных данных . Благодаря разработке архитектуры с нуля для использования в распределенных средах, где надежность и масштабируемость должны иметь главное значение, Elasticsearch дает возможность легко выйти за рамки простого полнотекстового поиска. Благодаря своей прочной набор API-интерфейсов и запросов, DSL, плюс клиенты для наиболее популярных языков программирования, Elasticsearch поставляет на в будущем безграничные возможности в организации технологии поиска.
Kibana (послед версия 4.5): Kibana является визуализатором данных движка Elasticsearch, что позволяет нам изначально взаимодействовать со всеми данными в Elasticsearch через пользовательские инструментальные панели. динамические панели Kibana могут сохранятся, разделяться и экспортироваться, отображать изменения запросов в Elasticsearch в режиме реального времени. Вы можете выполнять анализ данных в пользовательском интерфейсе Kibana, используя заранее разработанные инструментальные панелей или обновлять эти панели мониторинга в режиме реального времени для анализа данных по лету.
Fluentdtd-agent v2.3.1): Fluentd является решением с  открытым исходным кодом для сбора данных которое позволяет унифицировать сбор данных для большего понимания и удобства дальнейшего анализа.

fluentd-before

fluentd-architecture

 

Я представил один из вариантов системы — для возможности разрешения конфликтов в зависимостях.

Кратко смысл всей системы  — rsyslog(стандартная системная утилита для логирования действий в linux) является «форвардером» логов во Fluentd. Fluentd в свою очередь обрабатывает и агрегирует эти логи(собирает их с других машин)  Далее elasticsearch обрабатывает все логи, полученные из fluentd(c помощью плагина), а благодаря Kibana мы получаем всю это информацию в красивой обертке через веб-морду. Это мы будем иметь в итоге.

Наша конфигурация, которую мы будем иметь в итого будет отличаться, от верхней схемы и будет иметь следующий вид:

fluentd+elastic+kibana

Т.е. мы будем иметь одну главную машину для сбора, агрегации и вывода логов через web морду Kibana.

2 Вариант 1 — реализация через fluentd agregator+fluentd forwarders

2.1 Установка — подготавливаем сервер сбора логов.

Информация.

На сервер мы установим fluentd, elasticsearch plugin,elastic search, kibana. Всё тестировалось на dedian 8. Назовем нашу машину — logserver. IP — 10.4.1.174

Linux logserver 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u4 (2016-02-29) x86_64 GNU/Linux. Итак, приступим к установке.

Elasticsearch

На данный момент последней версией является 2.3.0 — её мы и установим.

Для начала устанавливаем java:

Устанавливаем  сам elasticsearch 2.3.0

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

Отредактируем файл /etc/elasticsearch/elasticsearch.yml

Укажем , что никто по сети не мог читать наши данные(если необходимо)

Установка kibana 4.5 

Устанавливать Kibana будем из репозитория. Последняя версия 4.5

Добавляем ключ:

Создадим source list:

Обновимся

Установим Kibana через команду

Кибана 4.5 установлена. Добавим ее в автозагрузку

Откроем файл для настройки

Укажем ip, на котором будет сидеть Kibana. Можете указать свой ип в сети(для этого поставим 0.0.0.0). Так же укажем url elasticsearch.

Kibana и Elasticsearch динамический поиск

By default, Elasticsearch enables dynamic mapping for fields. Kibana needs dynamic mapping to use fields in visualizations correctly, as well as to manage the .kibana index where saved searches, visualizations, and dashboards are stored.

If your Elasticsearch use case requires you to disable dynamic mapping, you need to manually provide mappings for fields that Kibana uses to create visualizations. You also need to manually enable dynamic mapping for the .kibana index.

The following procedure assumes that the .kibana index does not already exist in Elasticsearch and that the index.mapper.dynamic setting in elasticsearch.yml is set to false:

  1. Запустить elaticsearch
  2. Создать файл индекса .kibana с динамическим отображением включенным только для этого индекса

PUT .

kibana { «index.mapper.dynamic»: true }

  1. Start Kibana and navigate to the web UI and verify that there are no error messages related to dynamic mapping.

Подключаем Еластиксёарч с Кибана

Before you can start using Kibana, you need to tell it which Elasticsearch indices you want to explore. The first time you access Kibana, you are prompted to define an index pattern that matches the name of one or more of your indices. That’s it. That’s all you need to configure to start using Kibana. You can add index patterns at any time from the Settings tab.

Рестартим kibana Смотрим нашу Kibanu в браузере https://<kibana_dns_name>:5601

kibana_status

kibana install

Fluentd(td-agent) install (debian jessie)

Флюенд это последняя часть нашей системы, он будет производить отправку логов или в другую систему fluentd  или в elasticsearch. Устанавливаем на агрегаторе(ресивере) и форвардерах(отправителях). Для начала настроим систему чтобы она не стопорилась.

Оттюнингуем sysctrl.conf

Применяем конфигурацию:

Ставим необходимые пакеты пакеты:

Теперь установим fluentd и создадим папку для конфигов (будем их дальше включать в данную папку для удобства — они подхватятся):

По-умолчанию Fluentd не умеет работать с  Elasticsearch. Чтобы решить эту проблему мы установим специальный плагин,ставим его на агрегатор Fluentd, не на форвардерах (отправителях логов), так как в нашей схеме форвардеры отправляют данные fluentd на агрегатор, а он уже отпраляет их в elasticsearch. Идём в терминал:

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

Реастартим сервис

Создадим конфиг, который будет собирать данные с других серверов(отправителей логов):

Вставим следующий код туда

Сохраняемся.

Не забываем открыть порты( с них мы будем слушать логи, которые нам посылаю серверы)

Сохраним их

Далее перейдем к настройке отправителей логов.

3 Установка — настраиваем отправители логов.

Fluentd(td-agent) может выступать в роли как агрегатора так и отправителя логов. Логи он будет брать из нативной системы логирования debian(ubuntu) — rsyslog. Для начала установим rsyslog, если его нет в системе:

Настроим rsyslog.

Добавим строку, она означает, что rsyslog будет отправлять данные на порт 42185, его будет слушать td-agent(fluentd). Дальше вы увидите, как это реализовано.

Сохраняемся.

sudo systemctl unmask rsyslog.service

Перезапустим Rsyslog сервис.

sudo service rsyslog restart

Далее установим Fluentd(td-agent)

Теперь установим fluentd и создадим папку для конфигов(будем их дальше включать для удобства):

Изменяем конфигурационный файл. Этот пример я взял(частично) из другого конфига, в нем так же задействован вариант со сбором логов из apache, нам можно понять из конфига что он берет данные из rsyslog(выше мы настроили отправку на порт 42185.)

Создадим конфиг для отправки логов на наш сервер сбора логов(10.4.1.130) на порт 24224:

nano /etc/td-agent/config.d/forwarder.conf

Поменяем права на каталог с логами

Реастартим сервис

Сохраняемся и рестартим td-agent.

3. Вариант 2 —  Rsyslog nodes > Rsyslog Agregator+fluentd+elasticsearch+kibana

Смысл данного варианта схемы в следующем — данные c серверов будет отправлять rsyslog на сервер агрегатор, на котором крутится fluentd+elastic+kibana.

rsyslog+fluentd+kibana

 

Для реализации данной схемы на понадобится изменить конфиги на клиенских машинах и заодно удалить td-agent:

Изменим его до этого вида:

Вот так.
Теперь создадим файл отправки логов с другого сервиса, например с nginx при ошибке — error. Создадим файл nginx.conf в папке /etc/rsyslog.d

Вставим туда следующий код

Это означает что все ошибка из файла на клиентской машине /var/log/nginx/error.log будут отправляться на сервер логов,там будет создаваться файл с название nginxerror.log (в папке с название хоста, как будет описано ниже). В итоге будет такая картина. Как у меня на примере в папке от хоста balance172 создается файл с ошибками nginx — nginxerror.ru

nginx ошибка на лог сервер

Перезапускаем клиентскую машину. 174 — ip сервера агрегатора.

На сервере(агрегаторе) вносим следующие изменения:

Редактируем файл /etc/rsyslog.conf для приема логов(по разным каталогам в зависимости от ip хоста).  Раскомментим и добавим:

Отредактируем файл  /etc/td-agent/td-agent.conf

Приводим к такому виду:

Удаляем все конфиги из папки /etc.td-agent/config.d/

Создаем только один файл там

Вставляем туда код

Отредактируем файл

укажем где будут храниться файлы:

Хранить их в корне /data и /logs — вы можете выбрать другие. Назначим права.

Рестартим все сервисы или быстрее сервак(как угодно).

sudo service td-agent restart

sudo service elasticsearch restart

 

5 Использование системы.

Переходим на сервер с kibana: https://kibana_ip:5601

kibana install

Теперь вы можете попробовать создавать виджеты — как это делать ? Смотрим оф. доки на сайте  the official documentation[4].

 

 

Об авторе

human administrator

    5 комментариев

    SlachДата:1:24 пп - Апр 28, 2016

    Можно узнать
    а почему fluentd а не logstash ?

    humanДата:5:51 пп - Апр 29, 2016

    Если честно понравилась возможность расширения функциональности с помощью плагинов.

    humanДата:6:05 пп - Апр 29, 2016

    Интересно было попробовать новое решение, тем более Fluentd имеет хороший потенциал — расширяется плагинами, позволяющими реализовывать сбор информации, например анализ твиттов вашего бизнес аккаунта.

    humanДата:12:43 пп - Май 4, 2016

    Для FLuentd больше расширений.

    ПавелДата:6:53 пп - Сен 22, 2016

    Доброго времени суток.
    Подскажите а вам приходилось собирать логи java приложений типа tomcat или jboss? У меня возникла проблема что при сборе в kiban’е логи выводятся построчно, т.е. стектрейс идет не целым куском а каждая строка в новом сообщении, читать не очень удобно. К примеру:
    вот так выглядит лог:
    2016-09-22 21:50:00,411 ERROR [org.jboss.as.ejb3] (EJB default — 83) WFLYEJB0029: Could not restore timer from /opt/wildfly-app/standalone/data/timer-service-data/core-process.coreps-timers.ClearProcessDataTimer/77007d47-4375-46c0-9c2b-a081158361c7.xml: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog
    at [row,col {unknown-source}]: [1,0]
    at com.ctc.wstx.sr.StreamScanner.throwUnexpectedEOF(StreamScanner.java:685)
    at com.ctc.wstx.sr.BasicStreamReader.handleEOF(BasicStreamReader.java:2141)
    at com.ctc.wstx.sr.BasicStreamReader.nextFromProlog(BasicStreamReader.java:2047)

    а вот так его представляет Kibana :

    September 22nd 2016, 18:46:21.000 host:xxx ident:java message: at org.wildfly.extension.requestcontroller.RequestController$QueuedTask$1.run(RequestController.java:496) @timestamp:September 22nd 2016, 18:46:21.000 _id:AVdSk5NjlfEFSA_UYhte _type:fluentd _index:logstash-2016.09.22 _score:

    September 22nd 2016, 18:46:21.000 host:xxx ident:java message:2016-09-23 02:46:20,797 ERROR [org.jboss.as.ejb3] (EJB default — 149) WFLYEJB0029: Could not restore timer from /opt/wildfly-app/standalone/data/timer-service-data/core-process.coreps-timers.ConsRepTimerBean/72d64bed-09fa-44b1-b30a-e89001816a6b.xml: com.ctc.wstx.exc.WstxEOFException: Unexpected EOF in prolog @timestamp:September 22nd 2016, 18:46:21.000 _id:AVdSk5NilfEFSA_UYhsX _type:fluentd _index:logstash-2016.09.22 _score:

    (логи я представил разные но общий смысл думаю понятен)

    в данном случае хотелось бы чтоб весь стектрейс входил в поле message целиком и не делился на строки.
    Может подскажете куда копать?
    Заранее спасибо!

    Оставить ответ

    Войти с помощью: