Логирование это просто! Настройка Elasticsearch + Logstash + Kibana в Debian

Без лишних слов опишу простую, масштабируемую и достаточно функциональную систему по централизованному хранению/визуализации логов. Скажу сразу — logstash это сердце данной системы. От его настройки зависит очень многое, точнее от настройки фильтров в logstash. Но тема фильтрации логов в logstash довольно непростая и очень обьемная, в данной статье я постараюсь максимально наглядно и понятно описать процесс установки и настройки системы в целом. В будущем планирую написать отдельную статью о фильтрации/парсинге логов в logstash.

Схема работы системы примерно такая:

rsyslog -> logstash -> elasticsearch -> kibana

rsyslog — клиентская часть системы. Настраивается на каждой машине/сервере для передачи логов по сети на сервер логов.
logstash + elasticsearch + kibana — серверная часть. Это по сути и есть сервис централизированного логирования.
Коротко о составляющих:
logstash — отвечает за прием логов по сети, фильтрацию, категоризацию, парсинг и дальнейшую передачу elasticsearch
elasticsearch — поисковый движок. Обрабатывает логи, что в дальнейшем обеспечивает очень быстрый поиск архивным логам
kibana — веб-приложение с удобным интерфейсом для визуализации и фильтрации логов. Можно настраивать различные графики и тд и тп.

Сразу оговорюсь что у меня в DNS внутренней сети есть запись Host A для сервера логов:

server-logs.my.local 10.0.0.100

На клиентских пк у меня стоит Debian Stable и там «из коробки» установлен rsyslog, нужно просто прописать одну единственную настроечку в его конфиге:

root@client:~# echo '*.* @@server-logs.my.local:10514' > /etc/rsyslog.d/server-logs.conf

После этого конечно нужно перегрузить сервис rsyslog

root@client:~# service rsyslog restart
[ ok ] Stopping enhanced syslogd: rsyslogd.
[ ok ] Starting enhanced syslogd: rsyslogd.
root@client:~#

Это все что надо было сделать на клиенте. Таким же образом можно настроить сколько угодно клиентов, только бы у них был доступ по сети к серверу логирования и уникальный FQDN.

Дальше на сервере логов (server-logs.my.local) устанавливаем и настраиваем все необходимые пакеты.
Установка и настройка Elasticsearch:

root@server-logs:~# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.1.deb
root@server-logs:~# dpkg -i elasticsearch-1.0.1.deb
root@server-logs:~# update-rc.d elasticsearch defaults 95 10
update-rc.d: using dependency based boot sequencing
root@server-logs:~# /etc/init.d/elasticsearch start
[ ok ] Starting Elasticsearch Server:.
root@server-logs:~#

Запустился — это хорошо, но надо чуток подправить конфиг

root@server-logs:~# vim /etc/elasticsearch/elasticsearch.yml

И правим вот до такого вида:

root@server-logs:~# cat /etc/elasticsearch/elasticsearch.yml |egrep -v '^#|^$'
cluster.name: elasticsearch
node.name: "Franz Kafka"
root@server-logs:~#

Этого достаточно для базовой настройки. Перегружаем сервис:

root@server-logs:~# /etc/init.d/elasticsearch restart
[ ok ] Stopping Elasticsearch Server:.
[ ok ] Starting Elasticsearch Server:.
root@server-logs:~#

Установка и настройка Logstash:
Для этого пакета есть репозиторий. Добавим новый источник пакетов в конфиг apt-а:

root@server-logs:~# echo 'deb http://packages.elasticsearch.org/logstash/1.4/debian stable main' > /etc/apt/sources.list.d/logstash.list
Установим logstash:
root@server-logs:~# apt-get update && apt-get install logstash

Дальше для примера — простенький конфиг:

root@server-logs:~# cat /etc/logstash/conf.d/rsyslog.conf
input {
  tcp {
    port => 10514
    type => syslog
  }
  udp {
    port => 10514
    type => syslog
  }
}

filter {
  if [message] =~ "access" {
    mutate { replace => { "type" => "apache_access" } }
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
   } else if [message] =~ "named" {
       grok {
        pattern => "<%{POSINT:priority}>%{SYSLOGLINE}"
        add_tag => [ "named" ]
        }
       }
  date {
    match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
  }
}

output {
  # Example just to output to elasticsearch
  elasticsearch {
                }
}
root@server-logs:~#

В конфиге обязательно должны быть 3 секции — input, filter, output. Их название говорит об их назначении. В данном простейшем случае:
input — принимает по tcp/udp на порту 10514 логи по сети (не забываем открыть этот порт в firewall, если он у вас настроен);
filter — ищет в логе слово «access» и если есть совпадение — отдает на «розпарсивание» паттерну «COMBINEDAPACHELOG», если совпадения нету, ищет по маске «named» и отделяет приоритет от сообщения, также розпарсивает дату по указанному формату;
output — отдает на дальнейшую обработку программе elasticsearch.

Для удобства просмотра и фильтрации логов установим Kibana. Для этого я создал отдельного пользователя, в дальнейшем можно будет настроить apache-itk или другой вариант запуска этого vhost от имени простого юзера. Делаю это, думаю, по всем известным причинам.
Установка и настройка Kibana:

root@server-logs:~# adduser weblog
root@server-logs:~# wget -c https://download.elasticsearch.org/kibana/kibana/kibana-3.0.0.tar.gz
root@server-logs:~# cd /home/weblog
root@server-logs:/home/weblog# tar xzvf /root/kibana-3.0.0.tar.gz .
root@server-logs:~# chown -R weblog:weblog /home/weblog/*

Должно получится примерно так:

root@server-logs:~# ls -l /home/weblog/kibana
total 44
drwxr-xr-x 7 weblog weblog 4096 Mar 21 12:33 app
-rw-rw-r-- 1 weblog weblog 3579 Mar 18 17:32 build.txt
-rw-rw-r-- 1 weblog weblog 2150 Mar 21 12:40 config.js
drwxr-xr-x 2 weblog weblog 4096 Mar 21 12:33 css
-rw-rw-r-- 1 weblog weblog 1150 Mar 18 17:32 favicon.ico
drwxr-xr-x 2 weblog weblog 4096 Mar 21 12:33 font
drwxr-xr-x 2 weblog weblog 4096 Mar 21 12:33 img
-rw-rw-r-- 1 weblog weblog 2073 Mar 18 17:32 index.html
-rw-rw-r-- 1 weblog weblog  562 Mar 18 17:32 LICENSE.md
-rw-rw-r-- 1 weblog weblog 3288 Mar 18 17:32 README.md
drwxr-xr-x 4 weblog weblog 4096 Mar 21 12:33 vendor
root@server-logs:~#

Чуть подправим config.js
Параметр elasticsearch должен выглядеть следующим образом:

elasticsearch: "http://server-logs.my.local:9200"

Ну и для выдачи в сеть через http этой веб-апликухи, настроим Apache2
Настройка Apache2:

root@server-logs:~# cat /etc/apache2/sites-available/007-kibana
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName www.server-logs.my.local
        ServerAlias *.server-logs.my.local server-logs.my.local
        DocumentRoot /home/weblog/kibana
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /home/weblog/kibana>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/kibana-error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/kibana-access.log combined
</VirtualHost>
root@server-logs:~#

Включаем этот VirtualHost:

root@server-logs:~# cd /etc/apache2/sites-enabled
root@server-logs:/etc/apache2/sites-enabled# ln -s ../sites-available/007-kibana 007-kibana
root@server-logs:/etc/apache2/sites-enabled# ls -l
total 0
lrwxrwxrwx 1 root root 29 Apr  9 09:29 007-kibana -> ../sites-available/007-kibana
root@server-logs:/etc/apache2/sites-enabled#

Перегружаем apache2 для применения изменений:

root@server-logs:~# service apache2 restart

Для доступа к логам теперь можно пробовать зайти на URL http://server-logs.my.local
Вот скрин моей настроенной kibana, уже даже с логами 🙂
Kibana installed

Ну так, вкратце, можно настроить очень мощную, полезную и удобную систему централизированного логирования. Как и говорил в начале, самая интересная часть — это парсинг логов с помощью logstash. В данной статье я старался максимально просто обьяснить и показать как установить и настроить систему для работы, а вот тонкую настройку оставлю на потом, чтобы не «роздувать» заметку. К тому же парсинг с помощью logstash это по сути «сердце» системы — тема довольно непростая, интересная и обьемная, обязательно напишу отдельную заметку об этом.

Хай щастить!

    • Артур
    • Октябрь 11th, 2014 5:26дп

    Не сталкивались с тем, что еластик просто вылетает. Даже тогда, когда никаких запросов (никакой нагрузки) к нему не было?

    • admin
    • Октябрь 13th, 2014 8:12дп

    @Артур
    В процессе настройки было всякое, логлевел в конфиге поставить на максимальный дебаг и смотреть логи — там будет ответ 🙂

    • Srgey
    • Апрель 2nd, 2015 5:34пп

    Откуда kibana берёт данные?

    • admin
    • Апрель 2nd, 2015 6:03пп

    @Srgey
    Вот же, в кибане есть конфиг:
    > Чуть подправим config.js
    > Параметр elasticsearch должен выглядеть следующим образом:

    • Denis
    • Декабрь 19th, 2016 11:56пп

    Артур :
    Не сталкивались с тем, что еластик просто вылетает. Даже тогда, когда никаких запросов (никакой нагрузки) к нему не было?

    проверь версию джавы

  1. Трэкбэков пока нет.

Why ask?