Home » Linux » CentOS » Как установить и настроить Elasticsearch, Logstash, Kibana (ELK Stack) на Ubuntu, Debian, Centos

Как установить и настроить Elasticsearch, Logstash, Kibana (ELK Stack) на Ubuntu, Debian, Centos

Большие информационные системы генерируют огромное количество служебной информации, которую нужно где-то хранить. Я расскажу о том, как настроить хранилище для логов на базе Elasticsearch, Logstash и Kibana, которое называют ELK Stack. В это хранилище можно настроить отправку практически любых логов в разных форматах и большого объема.

Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти .

Введение

Я буду настраивать одиночный хост. В данной статье будут самые азы - как сделать быструю установку и базовую настройку, чтобы можно было собирать логи в Elasticsearch и смотреть их в Kibana. Для примера, настрою сбор логов как с linux, так и windows серверов. Инструкция по установке будет полностью основана на официальной документации. Если вы хорошо читаете английские тексты, то можете использовать ее. Неудобство будет в том, что вся информация разрозненно располагается в разных статьях. Если вы первый раз настраиваете ELK Stack, то будет трудно сразу во всем разобраться. В своей статье я собрал в одном месте необходимый минимум для запуска Elasticsearch, Logstash, Kibana и агентов Filebeat и Winlogbeat для отправки логов с серверов.

Что такое ELK Stack

Расскажу своими словами о том, что мы будем настраивать. Ранее на своем сайте я уже рассказывал о централизованном сборе логов с помощью syslog-ng. Это вполне рабочее решение, хотя очевидно, что когда у тебя становится много логов, хранить их в текстовых файлах неудобно. Надо как-то обрабатывать и выводить в удобном виде для просмотра. Именно эти проблемы и решает представленный стек программ:

  • Elasticsearch используется для хранения, анализа, поиска по логам.
  • Kibana представляет удобную и красивую web панель для работы с логами.
  • Logstash сервис для сбора логов и отправки их в Elasticsearch. В самой простой конфигурации можно обойтись без него и отправлять логи напрямую в еластик. Но с logstash это делать удобнее.
  • Beats - агенты для отправки логов в Logstash или Elasticsearch. Они бывают разные. Я буду использовать Filebeat для отправки данных из текстовых логов linux и Winlogbeat для отправки логов из журналов Windows систем.

К этой связке еще добавляется Nginx, который проксирует соединения в Kibana. В самом простом случае он не нужен, но с ним удобнее. Можно, к примеру, добавить авторизацию или ssl сертификат, в nginx удобно управлять именем домена. В случае большой нагрузки, разные службы разносятся по разным серверам или кластерам. В своем примере я все установлю на один сервер. Схематично работу данной системы можно изобразить вот так: Схема работы ELK STACK (Elasticsearch, Logstash, Kibana) Начнем по этапам устанавливать и настраивать все компоненты нашей будущей системы хранения и обработки логов различных информационных систем.

Если у вас еще нет своего сервера с CentOS 8, то рекомендую мои материалы на эту тему:

Если у вас еще не настроен сервер с Debian, рекомендую мои материалы на эту тему:

Раньше для установки всех перечисленных компонентов необходимо было отдельно устанавливать Java на сервер. Сейчас в этом нет необходимости, так как Java уже включена в пакеты устанавливаемого ПО.

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

Для установки одиночного инстанса с полным набором компонентов ELK необходимы следующие системные ресурсы.

Системные требования для ELK Stack
  минимальные рекомендуемые
CPU 2 4+
Memory 6 Gb 8+ Gb
Disk 10 Gb 10+ Gb

Некоторое время назад для тестовой установки ELK Stack достаточно было 4 Gb оперативной памяти. На текущий момент с версией 7.15 у меня не получилось запустить одновременно Elasticsearch, Logstash и Kibana на одной виртуальной машине с четырьмя гигабайтами памяти. После того, как увеличил до 6, весь стек запустился. Но для комфортной работы с ним нужно иметь не менее 8 Gb и 4 CPU. Если меньше, то виртуальная машина начинает тормозить, очень долго перезапускаются службы. Работать некомфортно.

В системных требованиях для ELK я указал диск в 10 Gb. Этого действительно хватит для запуска стека и тестирования его работы на небольшом объеме данных. В дальнейшем, понятное дело, необходимо ориентироваться на реальный объем данных, которые будут храниться в системе. 

Установка Elasticsearch

Устанавливаем ядро системы по сбору логов - Elasticsearch. Его установка очень проста за счет готовых пакетов под все популярные платформы.

Centos 7 / 8

Копируем публичный ключ репозитория:

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Подключаем репозиторий Elasticsearch:

# mcedit /etc/yum.repos.d/elasticsearch.repo
[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

Приступаем к установке еластика:

# yum install --enablerepo=elasticsearch elasticsearch

В в завершении установки добавим elasticsearch в автозагрузку и запустим его с дефолтными настройками:

# systemctl daemon-reload
# systemctl enable elasticsearch.service
# systemctl start elasticsearch.service

Проверяем, запустилась ли служба:

# systemctl status elasticsearch.service

Установка Elasticsearch

Проверим теперь, что elasticsearch действительно нормально работает. Выполним к нему простой запрос о его статусе.

# curl 127.0.0.1:9200
{
  "name" : "centos8",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "XSsvp-nvTxi68TaEFN_OUg",
  "version" : {
    "number" : "7.15.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "83c34f456ae29d60e94d886e455e6a3409bba9ed",
    "build_date" : "2021-10-07T21:56:19.031608185Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Все в порядке, сервис реально запущен и отвечает на запросы.

Ubuntu / Debian

Копируем себе публичный ключ репозитория:

# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Если у вас нет пакета apt-transport-https, то надо установить:

# apt install apt-transport-https

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

# echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list

Устанавливаем Elasticsearch на Debian или Ubuntu:

# apt update && apt install elasticsearch

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

# systemctl daemon-reload 
# systemctl enable elasticsearch.service 
# systemctl start elasticsearch.service

Проверяем, запустился ли он:

# systemctl status elasticsearch.service

Проверим теперь, что elasticsearch действительно нормально работает. Выполним к нему простой запрос о его статусе.

# curl 127.0.0.1:9200
{
  "name" : "debian10",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "zsYgZQSeY6uvhWCkFJPiAA",
  "version" : {
    "number" : "7.15.1",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "8ced7813d6f16d2ef30792e2fcde3e755795ee04",
    "build_date" : "2021-10-07T21:56:19.031608185Z",
    "build_snapshot" : false,
    "lucene_version" : "8.9.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Если все в порядке, то переходим к настройке Elasticsearch.

Настройка Elasticsearch

Настройки Elasticsearch находятся в файле /etc/elasticsearch/elasticsearch.yml. На начальном этапе нас будут интересовать следующие параметры:

path.data: /var/lib/elasticsearch # директория для хранения данных
network.host: 127.0.0.1 # слушаем только локальный интерфейс

По умолчанию Elasticsearch слушает localhost. Нам это и нужно, так как данные в него будет передавать logstash, который будет установлен локально. Обращаю отдельное внимание на параметр для директории с данными. Чаще всего они будут занимать значительное место, иначе зачем нам Elasticsearch :) Подумайте заранее, где вы будете хранить логи. Все остальные настройки я оставляю дефолтными. После изменения настроек, надо перезапустить службу:

# systemctl restart elasticsearch.service

Смотрим, что получилось:

# netstat -tulnp | grep 9200
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      19788/java

Elasticsearch повис на локальном интерфейсе. Причем я вижу, что он слушает ipv6, а про ipv4 ни слова. Но его он тоже слушает, так что все в порядке. Переходим к установке Kibana. Если вы хотите, чтобы elasticsearch слушал все сетевые интерфейсы, настройте параметр:

network.host: 0.0.0.0

Только не спешите сразу же запускать службу. Если запустите, получите ошибку:

[2021-10-18T10:41:51,062][ERROR][o.e.b.Bootstrap          ] [centos8] node validation exception
[1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured

Настройка Elasticsearch

Чтобы ее избежать, дополнительно надо добавить еще один параметр:

discovery.seed_hosts: ["127.0.0.1", "[::1]"]

Этим мы указываем, что хосты кластера следует искать только локально.

Установка Kibana

Дальше устанавливаем web панель Kibana для визуализации данных, полученных из Elasticsearch. Тут тоже ничего сложного, репозиторий и готовые пакеты есть под все популярные платформы. Репозитории и публичный ключ для установки Kibana будут такими же, как в установке Elasticsearch. Но я еще раз все повторю для тех, кто будет устанавливать только Kibana, без всего остального. Это продукт законченный и используется не только в связке с Elasticsearch.

Centos

Импортируем ключ репозитория:

# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Добавляем конфиг репозитория:

# mcedit /etc/yum.repos.d/kibana.repo
[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

Запускаем установку Kibana:

# yum install kibana

Установка Kibana

Добавляем Кибана в автозагрузку и запускаем:

# systemctl daemon-reload
# systemctl enable kibana.service
# systemctl start kibana.service

Проверяем состояние запущенного сервиса:

# systemctl status kibana.service

Запуск Kibana По умолчанию, Kibana слушает порт 5601. Только не спешите его проверять после запуска. Кибана стартует долго. Подождите примерно минуту и проверяйте.

# netstat -tulnp | grep 5601
tcp        0      0 127.0.0.1:5601          0.0.0.0:*               LISTEN      20746/node

Ubuntu/Debian

Установка Kibana на Debian или Ubuntu такая же, как и на центос - подключаем репозиторий и ставим из deb пакета. Добавляем публичный ключ:

# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -

Добавляем рпозиторий Kibana:

# echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-7.x.list

Запускаем установку Kibana:

# apt update && apt install kibana

Добавляем Кибана в автозагрузку и запускаем:

# systemctl daemon-reload
# systemctl enable kibana.service
# systemctl start kibana.service

Проверяем состояние запущенного сервиса:

# systemctl status kibana.service

По умолчанию, Kibana слушает порт 5601. Только не спешите его проверять после запуска. Кибана стартует долго. Подождите примерно минуту и проверяйте.

# netstat -tulnp | grep 5601
tcp        0      0 127.0.0.1:5601          0.0.0.0:*               LISTEN      1487/node

Настройка Kibana

Файл с настройками Кибана располагается по пути - /etc/kibana/kibana.yml. На начальном этапе можно вообще ничего не трогать и оставить все как есть. По умолчанию Kibana слушает только localhost и не позволяет подключаться удаленно. Это нормальная ситуация, если у вас будет на этом же сервере установлен nginx в качестве reverse proxy, который будет принимать подключения и проксировать их в Кибана. Так и нужно делать в production, когда системой будут пользоваться разные люди из разных мест. С помощью nginx можно будет разграничивать доступ, использовать сертификат, настраивать нормальное доменное имя и т.д. Если же у вас это тестовая установка, то можно обойтись без nginx. Для этого надо разрешить Кибана слушать внешний интерфейс и принимать подключения. Измените параметр server.host, указав ip адрес сервера, например вот так:

server.host: "10.20.1.23"

Если хотите, чтобы она слушала все интерфейсы, укажите в качестве адреса 0.0.0.0. После этого Kibana надо перезапустить:

# systemctl restart kibana.service

Теперь можно зайти в веб интерфейс по адресу http://10.20.1.23:5601.

Настройка Kibana

Можно продолжать настройку и тестирование, а когда все будет закончено, запустить nginx и настроить проксирование. Я настройку nginx оставлю на самый конец. В процессе настройки буду подключаться напрямую к Kibana. При первом запуске Kibana предлагает настроить источники для сбора логов. Это можно сделать, нажав на Add your data. К сбору данных мы перейдем чуть позже, так что можете просто изучить интерфейс и возможности этой веб панели

Периодически вы можете видеть в веб интерфейсе предупреждение:

server.publicBaseUrl is missing and should be configured when running in a production environment. Some features may not behave correctly.

Чтобы его не было, просто добавьте в конфиг Kibana параметр:

server.publicBaseUrl: "http://10.20.1.23:5601/"

Или доменное имя, если используете его. 

Установка и настройка Logstash

Logstash устанавливается так же просто, как Elasticsearch и Kibana, из того же репозитория. Не буду еще раз показывать, как его добавить. Просто установим его и добавим в автозагрузку. Установка Logstash в Centos:

# yum install logstash

Установка Logstash Установка Logstash в Debian/Ubuntu:

# apt install logstash

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

# systemctl enable logstash.service

Запускать пока не будем, надо его сначала настроить. Основной конфиг logstash лежит по адресу /etc/logstash/logstash.yml. Я его не трогаю, а все настройки буду по смыслу разделять по разным конфигурационным файлам в директории /etc/logstash/conf.d. Создаем первый конфиг input.conf, который будет описывать прием информации с beats агентов.

input {
  beats {
    port => 5044
  }
}

Тут все просто. Указываю, что принимаем информацию на 5044 порт. Этого достаточно. Если вы хотите использовать ssl сертификаты для передачи логов по защищенным соединениям, здесь добавляются параметры ssl. Я буду собирать данные из закрытого периметра локальной сети, у меня нет необходимости использовать ssl. Теперь укажем, куда будем передавать данные. Тут тоже все относительно просто. Рисуем конфиг output.conf, который описывает передачу данных в Elasticsearch.

output {
        elasticsearch {
            hosts    => "localhost:9200"
            index    => "nginx-%{+YYYY.MM.dd}"
        }
	#stdout { codec => rubydebug }
}

Что мы настроили? Передавать все данные в elasticsearch под указанным индексом с маской в виде даты. Разбивка индексов по дням и по типам данных удобна с точки зрения управления данными. Потом легко будет выполнять очистку данных по этим индексам. Я закомментировал последнюю строку. Она отвечает за логирование. Если ее включить, то все поступающие данные logstash будет отправлять дополнительно в системный лог. В centos это /var/log/messages. Используйте только во время отладки, иначе лог быстро разрастется дублями поступающих данных. Остается последний конфиг с описанием обработки данных. Тут начинается небольшая уличная магия, в которой я разбирался некоторое время. Расскажу ниже. Рисуем конфиг filter.conf.

filter {
 if [type] == "nginx_access" {
    grok {
        match => { "message" => "%{IPORHOST:remote_ip} - %{DATA:user} \[%{HTTPDATE:access_time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"" }
    }
  }
  date {
        match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
  }
  geoip {
         source => "remote_ip"
         target => "geoip"
         add_tag => [ "nginx-geoip" ]
  }
}

Первое, что делает этот фильтр, парсит логи nginx с помощью grok, если указан соответствующий тип логов, и выделяет из лога ключевые данные, которые записывает в определенные поля, чтобы потом с ними было удобно работать. С обработкой логов у новичков возникает недопонимание. В документации к filebeat хорошо описаны модули, идущие в комплекте, которые все это и так уже умеют делать из коробки, нужно только подключить соответствующий модуль.

Модули filebeat работают только в том случае, если вы отправляете данные напрямую в Elasticsearch. На него вы тоже ставите соответствующий плагин и получаете отформатированные данные с помощью elastic ingest. Но у нас работает промежуточное звено Logstash, который принимает данные. С ним плагины filebeat не работают, поэтому приходится отдельно в logstash парсить данные. Это не очень сложно, но тем не менее. Как я понимаю, это плата за удобства, которые дает logstash. Если у вас много разрозненных данных, то отправлять их напрямую в Elasticsearch не так удобно, как с использованием предобработки в Logstash.

Для фильтра grok, который использует Logstash, есть удобный дебаггер, где можно посмотреть, как будут парситься ваши данные. Покажу на примере одной строки из конфига nginx. Например, возьмем такую строку из лога:

180.163.220.100 - travvels.ru [05/Sep/2021:14:45:52 +0300] "GET /assets/galleries/26/1.png HTTP/1.1" 304 0 "https://travvels.ru/ru/glavnaya/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"

И посмотрим, как ее распарсит правило grok, которое я использовал в конфиге выше.

%{IPORHOST:remote_ip} - %{DATA:user} \[%{HTTPDATE:access_time}\] \"%{WORD:http_method} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_sent_bytes} \"%{DATA:referrer}\" \"%{DATA:agent}\"

Собственно, результат вы можете сами увидеть в дебаггере. Фильтр распарсит лог и на выходе сформирует json, где каждому значению будет присвоено свое поле, по которому потом удобно будет в Kibana строить отчеты и делать выборки. Только не забывайте про формат логов. Приведенное мной правило соответствует дефолтному формату main логов в nginx. Если вы каким-то образом модифицировали формат логов, внесите изменения в grok фильтр. Надеюсь понятно объяснил работу этого фильтра. Вы можете таким образом парсить любые логи и передавать их в еластикс. Потом на основе этих данных строить отчеты, графики, дашборды.

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

В конце я использую geoip фильтр, который на основе ip адреса, который мы получили ранее с помощью фильтра grok и записали в поле remote_ip, определяет географическое расположение. Он добавляет новые метки и записывает туда географические данные. Для его работы используется база данных из файла /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-filter-geoip-6.0.3-java/vendor/GeoLite2-City.mmdb. Она будет установлена вместе с logstash. Впоследствии вы скорее всего захотите ее обновлять. Раньше она была доступна по прямой ссылке, но с 30-го декабря 2019 года правила изменились. База по-прежнему доступна бесплатно, но для загрузки нужна регистрация на сайте сервиса. Регистрируемся и качаем отсюда - https://dev.maxmind.com/geoip/geoip2/geolite2/#Download_Access. Передаем на сервер, распаковываем и копируем в /etc/logstash файл GeoLite2-City.mmdb. Теперь нам нужно в настройках модуля geoip указать путь к файлу с базой. Добавляем в /etc/logstash/conf.d/filter.conf:

geoip {
 database => "/etc/logstash/GeoLite2-City.mmdb"
 source => "remote_ip"
 target => "geoip"
 add_tag => [ "nginx-geoip" ]
}

Закончили настройку logstash. Запускаем его:

# systemctl start logstash.service

Можете проверить на всякий случай лог /var/log/logstash/logstash-plain.log, чтобы убедиться в том, что все в порядке. Признаком того, что скачанная geoip база успешно добавлена будет вот эта строчка в логе:

[2021-10-18T12:52:07,118][INFO ][logstash.filters.geoip   ][main] Using geoip database {:path=>"/etc/logstash/GeoLite2-City.mmdb"}

Теперь настроим агенты для отправки данных.

Установка Filebeat для отправки логов в Logstash

Установим первого агента Filebeat на сервер с nginx для отправки логов веб сервера на сервер с ELK. Ставить можно как из общего репозитория, который мы подключали ранее, так и по отдельности пакеты. Как ставить - решать вам. В первом случае придется на все хосты добавлять репозиторий, но зато потом удобно обновлять пакеты. Если подключать репозиторий не хочется, можно просто скачать пакет и установить его. Ставим на Centos.

# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.1-x86_64.rpm
# rpm -vi filebeat-7.15.1-x86_64.rpm

В Debian/Ubuntu ставим так:

# curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.1-amd64.deb
# dpkg -i filebeat-7.15.1-amd64.deb

Или просто:

# yum install filebeat
# apt install filebeat

После установки рисуем примерно такой конфиг /etc/filebeat/filebeat.yml для отправки логов в logstash.

filebeat.inputs:
- type: log
  enabled: true
  paths:
      - /var/log/nginx/*-access.log
  fields:
    type: nginx_access
  fields_under_root: true
  scan_frequency: 5s

- type: log
  enabled: true
  paths:
      - /var/log/nginx/*-error.log
  fields:
    type: nginx_error
  fields_under_root: true
  scan_frequency: 5s

output.logstash:
  hosts: ["10.1.4.114:5044"]

xpack.monitoring:
  enabled: true
  elasticsearch:
    hosts: ["http://10.1.4.114:9200"]

Некоторые пояснения к конфигу, так как он не совсем дефолтный и минималистичный. Я его немного модифицировал для удобства. Во-первых, я разделил логи access и error с помощью отдельного поля type, куда записываю соответствующий тип лога: nginx_access или nginx_error. В зависимости от типа меняются правила обработки в logstash. Плюс, я включил мониторинг и для этого указал адрес elastichsearch, куда filebeat передает данные мониторинга напрямую. Показываю это для вас просто с целью продемонстрировать возможность. У меня везде отдельно работает мониторинг на zabbix, так что большого смысла в отдельном мониторинге нет. Но вы посмотрите на него, возможно вам он пригодится. Чтобы мониторинг работал, его надо активировать в соответствующем разделе в Management - Stack Monitoring.

Настройка мониторинга ELK

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

# systemctl start filebeat
# systemctl enable filebeat

Проверяйте логи filebeat в дефолтном системном логе. По умолчанию, он все пишет туда. Лог весьма информативен. Если все в порядке, увидите список всех логов в директории /var/log/nginx, которые нашел filebeat и начал готовить к отправке. Если все сделали правильно, то данные уже потекли в elasticsearch. Мы их можем посмотреть в Kibana. Для этого открываем web интерфейс и переходим в раздел Discover. Так как там еще нет индекса, нас перенаправит в раздел Managemet, где мы сможем его добавить.

Создание index pattern в Kibana

Вы должны увидеть индекс, который начал заливать logstash в elasticsearch. В поле Index pattern введите nginx-* . Выберите имя поля для временного фильтра. У вас будет только один вариант - @timestamp, выбирайте его и жмите Create Index Pattern.

Create Index Pattern

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

Kibana Discover

Получение логов с веб сервера nginx на linux настроили. Подобным образом настраивается сбор и анализ любых логов. Можно либо самим писать фильтры для парсинга с помощью grok, либо брать готовые. Вот несколько моих примеров по этой теме:

Теперь сделаем то же самое для журналов windows.

Установка и настройка Winlogbeat

Для настройки централизованного сервера сбора логов с Windows серверов, установим сборщика системных логов winlogbeat. Для этого скачаем его и установим в качестве службы. Идем на страницу загрузок и скачиваем msi версию под вашу архитектуру - 32 или 64 бита. Запускаем инсталлятор и в конце выбираем открытие директории по умолчанию.

Установка Winlogbeat Создаем и правим конфигурационный файл winlogbeat.yml. Я его привел к такому виду:

winlogbeat.event_logs:
  - name: Application
    ignore_older: 72h
  - name: Security
  - name: System

tags: ["winsrv"]

output.logstash:
  hosts: ["10.1.4.114:5044"]

logging.level: info
logging.to_files: true
logging.files:
  path: C:/ProgramData/Elastic/Beats/winlogbeat
  name: winlogbeat.log
  keepfiles: 7

xpack.monitoring:
  enabled: true
  elasticsearch:
    hosts: ["http://10.1.4.114:9200"]

В принципе, по тексту все понятно. Я беру 3 системных лога Application, Security, System (для русской версии используются такие же названия) и отправляю их на сервер с logstash. Настраиваю хранение логов и включаю мониторинг по аналогии с filebeat. Отдельно обращаю внимание на tags: ["winsrv"]. Этим тэгом я помечаю все отправляемые сообщения, чтобы потом их обработать в logstash и отправить в elasticsearch с отдельным индексом. Я не смог использовать поле type, по аналогии с filebeat, потому что в winlogbeat в поле type жестко прописано wineventlog и изменить его нельзя. Если у вас данные со всех серверов будут идти в один индекс, то можно tag не добавлять, а использовать указанное поле type для сортировки. Если же вы данные с разных среверов хотите помещать в разные индексы, то разделяйте их тэгами. Для того, чтобы логи виндовых журналов пошли в elasticsearch не в одну кучу вместе с nginx логами, нам надо настроить для них отдельный индекс в logstash в разделе output. Идем на сервер с logstash и правим конфиг output.conf.

output {
    if [type] == "nginx_access" {
        elasticsearch {
            hosts     => "localhost:9200"
            index    => "nginx-%{+YYYY.MM.dd}"
        }
    }
    else if [type] == "nginx_error" {
        elasticsearch {
            hosts     => "localhost:9200"
            index    => "nginx-%{+YYYY.MM.dd}"
        }
    }
    else if "winsrv" in [tags] {
        elasticsearch {
            hosts     => "localhost:9200"
            index    => "winsrv-%{+YYYY.MM.dd}"
        }
    }
    else {
        elasticsearch {
            hosts     => "localhost:9200"
            index    => "unknown_messages"
        }
    }
	#stdout { codec => rubydebug }
}

Думаю, по тексту понятен смысл. Я разделил по разным индексам логи nginx, системные логи виндовых серверов и добавил отдельный индекс unknown_messages, в который будет попадать все то, что не попало в предыдущие. Это просто задел на будущее, когда конфигурация будет более сложная, можно будет ловить сообщения, которые по какой-то причине не попали ни в одно из приведенных выше правил. Я не смог в одно правило поместить оба типа nginx_error и nginx_access, потому что не понял сходу, как это правильно записать, а по документации уже устал лазить, выискивать информацию. Так получился рабочий вариант. После этого перезапустил logstash и пошел на windows сервер, запустил службу Elastic Winlogbeat 7.15.1. Настройка Winlogbeat Подождал немного, пока появятся новые логи на виндовом сервере, зашел в Kibana и добавил новые индексы. Напомню, что делается это в разделе Stack Management ->  -> Index Patterns. Создание индекса Добавляем новый индекс по маске winsrv-*. Шаблон для windows логов Можно идти в раздел Discover и просматривать логи с Windows серверов.

Просмотр windows логов в elk stack У меня без проблем все заработало в том числе на серверах с русской версией Windows. Все логи, тексты в сообщениях на русском языке нормально обрабатываются и отображаются. Проблем не возникло нигде. На этом я закончил настройку ELK стека из Elasticsearch, Logstash, Kibana, Filebeat и Winlogbeat. Описал основной функционал по сбору логов. Дальше с ними уже можно работать по ситуации - строить графики, отчеты, собирать дашборды и т.д. В отдельном разделе ELK Stack у меня много примеров на этот счет.

Настройка безопасности и авторизация в Kibana

Во время предыдущих настроек вы могли заметить информационные сообщения в веб интерфейсе, которые постоянно выскакивали. Текст их следующий:

Warning: 299 Elasticsearch-7.15.1-83c34f456ae29d60e94d886e455e6a3409bba9ed "Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.elastic.co/guide/en/elasticsearch/reference/7.15/security-minimal-setup.html to enable security."

Нас предупреждают, что в настоящий момент аутентификация не настроена, поэтому доступ к информации может получить любой желающий. Если для вас это не проблема и вы изолировали доступ к данным, к примеру, на уровне firewall, можете игнорировать эти сообщения. Далее я расскажу, как избавиться от этого предупреждения и настроить доступ к поиску elastic, а также информации в Kibana с помощью авторизации по пользователю и паролю. 

Открываем конфиг кластера в файле elasticsearch.yml и добавляем туда параметр:

xpack.security.enabled: true

Перезапускаем службу elasticsearch:

# systemctl restart elasticsearch

Если вы ранее не настраивали работу кластера по ssl, то скорее всего получите ошибку:

[ERROR][o.e.b.Bootstrap          ] [centos8] node validation exception
[1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.
bootstrap check failure [1] of [1]: Transport SSL must be enabled if security is enabled on a [basic] license. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false]

Для того, чтобы настройки xpack.security заработали, добавляем еще один параметр:

xpack.security.transport.ssl.enabled: true

Запускаем elasticsearch еще раз. Теперь он должен запуститься, но доступа к нему ни у кого не будет. Kibana будет показывать ошибку:

{"statusCode":503,"error":"Service Unavailable","message":"License is not available."}

Kibana "error":"Service Unavailable","message":"License is not available."

Нам нужно подготовить учётные данные, которые будем использовать для доступа к elasticsearch. Для этого запускаем утилиту elasticsearch-setup-passwords. По умолчанию она находится в папке /usr/share/elasticsearch/bin.

# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

Настройка учетных записей в elasticsearch

Данные пароли вам стоит сохранить, так как в открытом виде вы их больше нигде не увидите. Они вам понадобятся далее, для организации доступа к кластеру остальным компонентам стека. 

Настраиваем парольный доступ к кластеру для Kibana, используя сгенерированный только что пароль. Для этого добавляем в конфиг kibana.yml параметры:

xpack.security.enabled: true
elasticsearch.username: "kibana_system"
elasticsearch.password: "JArsJZj10YC8LlPlQr4u"

После этого перезапустите службу и пробуйте зайти в веб интерфес. Вы должны увидеть окно авторизации. Чтобы попасть в веб интерфейс, необходимо использовать сгенерированную ранее учетную запись elastic !!! А не какую-либо другую.

Встроенная авторизация в Kibana по паролю

Мы настроили доступ в Kibana по паролю. Управялть пользователями и ролями можно через веб интерфейс. Делается это в разделе Stack Management -> Users. Там можно как отредактировать встроенные учетные записи, так и добавить новые. 

Список пользователей в Kibana

Сделаем это на примере пользователя для Logstash. Создадим отдельного юзера с правами на запись в нужные нам индексы. Для этого сначала создадим роль с соответствующими правами. Переходим в Roles и добавляем новую.

Настройка новой роли

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

Добавление нового пользователя

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

[ERROR][logstash.outputs.elasticsearch][main][f8cdb7a9c640d0ed412a776071b8530fd5c0011075712a1979bee6c58b4c1d9f] Encountered a retryable error (will retry with exponential backoff) {:code=>401, :url=>"http://localhost:9200/_bulk", :content_length=>2862}

Открываем конфиг logstash, отвечающий за output и добавляем туда учетные данные для доступа в кластер. Выглядеть это будет примерно так:

output {
        elasticsearch {
            user     => "logstash_nginx_rw"
            password => "gdhsgfadsfsdfgsfdget45t"
            hosts    => "localhost:9200"
            index    => "nginx-%{+YYYY.MM.dd}"
        }
}

После этого данные как и прежде начнут поступать из logstash в elasticsearch, только теперь уже с авторизацией по пользователю и паролю.

Проксирование подключений к Kibana через Nginx

Я не буду подробно рассказывать о том, что такое проксирование в nginx. У меня есть отдельная статья на эту тему - настройка proxy_pass в nginx. Приведу просто пример конфига для передачи запросов с nginx в kibana. Я рекомендую использовать ssl сертификаты для доступа к Kibana. Даже если в этом нет объективной необходимости, надоедают уведомления браузеров о том, что у вас небезопасное подключение. Подробная инструкция по установке, настройке и использованию ssl в nginx так же есть у меня на сайте - настройка web сервера nginx. Все подробности настройки nginx смотрите там. Вот примерный конфиг nginx для проксирования запросов к Kibana с ограничением доступа по паролю:

server {
	listen 443;

	server_name kibana.site.ru;
	ssl_certificate /etc/letsencrypt/live/kibana.site.ru/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/kibana.site.ru/privkey.pem;

	location / {
		auth_basic "Restricted Access";
		auth_basic_user_file /etc/nginx/htpasswd.kibana;
		proxy_pass http://localhost:5601;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection 'upgrade';
		proxy_set_header Host $host;
		proxy_cache_bypass $http_upgrade;
	}
}

Создаем файл для пользователей и паролей:

# htpasswd -c /etc/nginx/htpasswd.kibana kibanauser

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

# yum install httpd-tools

После этого выйдет запрос на ввод пароля. С помощью приведенной выше команды мы создали файл с информацией о пользователе и пароле kibanauser для ограничения доступа к web панели кибана. Если у вас настроена внутренняя авторизация в Kibana, то большого смысла делать примерно то же самое через nginx нет. Но это на ваше усмотрение. Auth_basic позволяет полностью скрыть информацию о том, какой сервис находится за авторизацией, что может быть очень актуально при прямом доступе к Kibana из интернета.

Автоматическая очистка индексов в elasticsearch

Некоторое время назад для автоматической очистки индексов в Elasticsearch необходимо было прибегать к помощи сторонних продуктов. Наиболее популярным был Curator. Сейчас в Kibana есть встроенный инструмент для очистки данных - Index Lifecycle Policies. Его не трудно настроить самостоятельно, хотя и не могу сказать, что там всё очевидно. Есть некоторые нюансы, так что я по шагам расскажу, как это сделать. Для примера возьму всё тот же индекс nginx-*, который использовал ранее в статье.

Настроим срок жизни индексов следующим образом:

  1. Первые 30 дней - Hot phase. В этом режиме индексы активны, в них пишутся новые данные. 
  2. После 30-ти дней - Cold phase. В этой фазе в индексы невозможна запись новых данных. Запросы к этим данным имеют низкий приоритет. 
  3. Все, что старше 90 дней удаляется.

Чтобы реализовать эту схему хранения данных, идем в раздел Stack Management -> Index Lifecycle Management и добавляем новую политику. Я её назвал Nginx_logs. Выставляем параметры фаз в соответствии с заданными требованиями. 

Очистка индексов в elasticsearch

Не уместилось полное изображение настроек, но, думаю, вы там сами разберётесь, что выбрать. Ничего сложного тут нет. Далее нам нужно назначить новую политику хранения данных к индексам. Для этого переходим в Index Management -> Index Templates и добавляем новый индекс. В качестве шаблона укажите nginx-*, все остальные параметры можно оставить дефолтными. 

Создание шаблона для индексов

Теперь возвращаемся в Index Lifecycle Policies, напротив нашей политики нажимаем на + и выбираем только что созданный шаблон. 

Назначение Lifecycle Policies к шаблону

Проверяем свойства шаблона и убеждаемся в том, что Lifecycle Policies применилась. 

Проверка Lifecycle Policies

Теперь ко всем новым индексам, созданным по этому шаблону, будет применяться политика хранения данных. Для уже существующих это нужно проделать вручную. Достаточно выбрать нужный индекс и в выпадающем списке с опциями выбрать нужное действие. 

Настройка встроенной политики управления индексами

Такими несложными действиями можно настроить автоматическую очистку индексов встроенными инструментами Elasticsearch и Kibana. В некоторых случаях быстрее и удобнее воспользоваться Curator, особенно если нужно быстро реализовать много разных схем. Единый конфиг куратора выглядит более наглядным, но это уже вкусовщина и от ситуации зависит. 

Часто задаваемые вопросы по теме статьи (FAQ)

Можно ли вместо filebeat использовать другие программы для сбора логов?

Да, можно. Наиболее популярной заменой filebeat является Fluentd. Она более функциональна и производительна. В некоторых случаях может взять на себя часть функционала по начально обработке данных. В итоге, можно отказаться от logstash.

Можно ли в данной связке обойтись без logstash?

Да, если вы просто собираете логи, без предварительной обработки и изменения, можно отправлять данные напрямую в elasticsearch. На нем их так же можно обработать с помощью grok фильтра в elastic node. Вариант рабочий, но не такой функциональный, как logstash.

Есть ли в elasticsearch какой-то штатный механизм очистки старых данных?

Да, есть такой механизм - Index Lifecycle Policies, который требует отдельной настройки в Kibana. Также можно использовать сторонний софт. Пример такого софта - curator.

Как штатно настроить tls сертификат в Kibana?

Проще всего использовать для этого nginx в режиме proxy_pass. С его помощью можно без проблем подключить бесплатные сертификаты от Let's Encrypt.

Какие минимальные системные требования для запуска ELK Stack?

Начать настройку можно с 2CPU и 6Gb RAM. Но для более ли менее комфортной работы желательно 8G RAM.

Заключение

Я постарался рассказать подробно и понятно о полной настройке ELK Stack. Информацию в основном почерпнул в официальной документации. Мне не попалось более ли менее подробных статей ни в рунете, ни в буржунете, хотя искал я основательно. Вроде бы такой популярный и эффективный инструмент, но статей больше чем просто дефолтная установка я почти не видел.

В эксплуатации подобного стэка много нюансов. Например, если отказаться от Logstash и отправлять данные с beats напрямую в Elasticsearch, то на первый взгляд все становится проще. Штатные модули beats сами парсят вывод, устанавливают готовые визуализации и дашборды в Kibana. Вам остается только зайти и любоваться красотой :) Но на деле все выходит не так красиво, как хотелось бы. Кастомизация конфигурации усложняется. Изменение полей в логах приводит к более сложным настройкам по вводу этих изменений в систему. Все настройки поступающей информации переносятся на каждый beats, изменяются в конфигах отдельных агентов. Это неудобно.

В то же время, при использовании Logstash, вы просто отправляете данные со всех beats на него и уже в одном месте всем управляете, распределяете индексы, меняете поля и т.д. Все настройки перемещаются в одно место. Это более удобный подход. Плюс, при большой нагрузке вы можете вынести logstash на отдельную машину.

Я не рассмотрел в своей статье такие моменты как создание визуализаций и дашбордов в Кибана, так как материал уже и так получился объемный. Мне стало трудно всё это увязывать в одном месте. Смотрите остальные мои материалы по данной теме. Там есть примеры. Также я не рассмотрел такой момент. Logstash может принимать данные напрямую от syslog. Вы можете, к примеру, в nginx настроить отправку логов в syslog, минуя файлы и beats. Это может быть более удобно, чем описанная мной схема. Особенно это актуально для сбора логов с различных сетевых устройств, на которые невозможно поставить агента, например mikrotik. Syslog поток также можно парсить на ходу с помощью grok.

Подводя итог скажу, что с этой системой хранения логов нужно очень вдумчиво и внимательно разбираться. С наскока ее не осилить. Чтобы было удобно пользоваться, нужно много всего настроить. Я описал только немного кастомизированный сбор данных, их визуализация - отдельный разговор. Сам я постоянно использую и изучаю систему, поэтому буду рад любым советам, замечаниям, интересным ссылкам и всему, что поможет освоить тему. Все статьи раздела elk stack - https://serveradmin.ru/category/elk-stack/.

Онлайн курс по Kubernetes

Онлайн-курс по Kubernetes – для разработчиков, администраторов, технических лидеров, которые хотят изучить современную платформу для микросервисов Kubernetes. Самый полный русскоязычный курс по очень востребованным и хорошо оплачиваемым навыкам. Курс не для новичков – нужно пройти вступительный тест.

Если вы ответите "да" хотя бы на один вопрос, то это ваш курс:
  • устали тратить время на автоматизацию?
  • хотите единообразные окружения?;
  • хотите развиваться и использовать современные инструменты?
  • небезразлична надежность инфраструктуры?
  • приходится масштабировать инфраструктуру под растущие потребности бизнеса?
  • хотите освободить продуктовые команды от части задач администрирования и автоматизации и сфокусировать их на развитии продукта?
Сдавайте вступительный тест по и присоединяйтесь к новому набору!.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

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

  1. Руслан

    Спасибо за статью.

    В качестве небольшого уточнения.
    У вас так написано: server.publicBaseUrl: "http://10.20.1.23:5601/"
    В документации так: This setting cannot end in a slash (/). Отсюда - https://www.elastic.co/guide/en/kibana/master/settings.html

    Хотя скорей всего это не на что не влияет.

  2. Здравствуйте, после настройки безопасности данные перестают поступать в logstash. В нем ошибок нет, но есть в elasticsearch.
    Authentication of [beats_system] was terminated by realm [reserved] - failed to authenticate user [beats_system]
    Думаю из-за нее проблема, но куда нужно вписать данные учетные записи не нашел.

  3. Алексей

    Здравствуйте.
    А как настраивать алерты и оповещение на почту?

  4. Помогает очень когда надо специфический фильтр сделать:
    Grok Debugger - https://grokdebug.herokuapp.com/

    • Спасибо. Я тоже именно этим пользуюсь. Где-то в статьях давал ссылку на него.

  5. >>Передаем на сервер, распаковываем и копируем в /etc/logstash файл GeoLite2-City.mmdb.

    >>Теперь нам нужно в настройках модуля указать путь к файлу с базой. Делается это так:

    Сорри, а где хранятся настройки этого модуля? Куда нужно писать его настройки?

  6. Приветствую.

    А как сделать rконфиги без ngnix, оставить только win и микротик, у меня просто не подключается сервера windows?

  7. Здравствуйте. Нужна помощь в настройке ELK, при настройке не пошел через 127.0.0.1. За основу взял эту статью. Когда elastic настроен через 0.0.0.0 без проблем логи собираются в Kibana|discover.
    beat стоят на конечных точках, а elastic в виртуалке, тогда 127.0.0.1 работать не будет, поэтому использовал проксирование через nginx
    Для elasticsearch: listen 8881, kibana:8882.
    HTTP без проблем открываются, через эти порты. Powershell тоже откликается при установлении дашбордов
    .\winlogbeat.exe setup -e `
    -E output.logstash.enabled=false `
    -E output.elasticsearch.hosts=['192.168.0.4:8881'] `
    -E setup.kibana.host=192.168.0.4:8882.
    Может кто сталкивался с этой проблемой?

    • может фаервол у меня рубит? Надо завтра глянуть настройки.
      Хотя обращения через http к kibana и elasticsearh работают. Ну или просто оставить 0.0.0.0 и все подключения разруливать фаерволом. Единственно смущает, что сам elastic не рекомендует оставлять эти настройки.
      Как можно проверить работу logstash->elasticsearh-> kibana чтобы выявить в чем проблема?

      • Все оказалось банальней. При переходе из тестовой среды в промышленную (использую две виртуалки) забыл в файле winlobeat.yml поменять ip, зато заменил порты )))
        Так что все замечательно работает. Возможно сказалось то, что сервак под ухом выдает море децибел и мешает сосредоточится. Перенес его сегодня подальше и вуаля.

        Полезные советы в настройке: чтобы в дашбордах Kibana не выходили ошибки надо чтобы индексы в output.conf, например
        index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
        совпадали индексом winlobeat.yml
        index: "winlogbeat-%{[agent.version]}-%{+yyyy.MM.dd}"
        мне это помогло, для стандартных дашбордов в Kibana. Согласен с мнением высказанным ниже, что лучше самому настраивать дашборды под себя.

        Владимир, респект за статью.

  8. спасибо за статью. все заработало. но кибана выдает ошибку "Mapping conflict" и потом поясняет что поле @timestamp в логах винды задано в разных типах, как я понимаю - где-то датой а где-то строкой. и просит "переиндексировать" для разрешения конфликта. у вас случайно нет статьи о том как это все правильно сделать?

    • Статьи нет. Сам не сталкивался с такой ошибкой.

      • Добрый день.
        Все настроил по статье, при попытке добавить time field выдает ошибку Mapping Conflict, как у человека выше, возможно что-то в пакетах обновилось?

  9. Сергей

    Здравствуйте Владимир!
    Поделитесь, пожалуйста, рабочим файлом Logstash input
    Например: windows, cisco, mikrotik, linux
    Никак не получается одновременно принимать логи с разных устройств.
    Спасибо!

  10. httpd-tools ставить не обязательно, htpasswd генерируется с помощью OpenSSL

  11. Екатерина

    Здравствуйте! На нашем сервере установлен Logstash.
    Также запущено несколько докер-образов с приложениями, логи которых пишутся в консоль.
    Можно посмотреть лог с помощью команды kubectl logs [название приложения].
    Подскажите, пожалуйста, как нужно описать input для Logstash, а также filebeat.yml,
    чтобы можно было получить логи этих приложений.

    • Я не знаю, как оптимально интегрировать приложения в kubernetes с logstash. Вариантов может быть несколько. В самих докер образах настроить вывод логов в формат syslog и указать в качестве сервера logstash, настроив на нем прием syslog логов. Если логи docker контейнеров пишутся в файлы, можно настроить через filebeat отправку содержимого этих файлов в logstash. Готовых настроек у меня нет. Надо по месту все настраивать.

  12. Евгейний

    Добрый день! я так и не понял из всей инструкции нужно ставить Кибану Эластик и Логстэш на одну виртуальную машину или каждый компонент на разные машины? И если все три компонента на разные машины то на какой должен крутиться nginx? я так понимаю на виртуалке с Эластиком?

    • Где угодно можете их ставить. Это все самостоятельные продукты. Я обычно сам elk stack ставлю на одну машины, а nginx на другую.

  13. Дмитрий

    Добрый день или я что-то не понимаю или тут логическая ошибка

    1. Вы настроили filebeat на отправку логов доступа и логов ошибок
    2. Logstash имеет output - nginx-%{+YYYY.MM.dd}, т.е согласно такому построению выходы, логи доступа и логи ошибок будут слиты в один индекс или как? У меня вообще логи ошибок не подтягиваются.....

    Теперь такой вопрос, если скажем серверов откуда тянем логи >1, т.е по сути вот такое называние индексов не годиться, nginx-%{+YYYY.MM.dd}, надо чтобы индекс имел название сервера (хост найм или IP) как такое организовать?

    • Логи идут в один общий индекс. В чем тут ошибка? Если надо разделить, разделяйте. Мне кажется, удобнее в одном общем держать. Но все от конкретной ситуации зависит. Можно как угодно индексы делить. Для каждого сервера или сайта свой индекс и т.д.

      Можно на каждом сервере через filebeate добавлять какую-то свою метку. Потом в logstash в зависимости от этой метки, отправлять в тот или иной индекс. У меня есть подобные примеры в статьях, где я собираю в elasticsearch данные с разных сервисов.

  14. Вячеслав

    Добрый день! Не подскажите с чем связано?

    2021-02-18T11:39:20.437+0400#011ERROR#011[publisher_pipeline_output]#011pipeline/output.go:154#011Failed to connect to backoff(async(tcp://192.168.1.27:5044)): dial tcp 192.168.1.27:5044: connect: connection refused

  15. В последних версиях Elasticsearch ввели ограничение на максимум шардов (1000).

    тут решение.
    https://berrynetworks.wordpress.com/tag/max_shards_per_node/

    • Спасибо за полезную информацию.

    • Дмитрий

      1. Добрый день
      2. Хочу запустить простейшую конфигурацию logstash, а именно:

      logstash -e 'input { stdin { } } output { stdout { } }'

      3. Сам исполняемый скрипт logstash у меня в Ubuntu 20 находится
      /usr/share/logstash/bin/logstash

      4. Находясь в каталоге из пункта 3, запускаю команду из пункта 2 и получаю command not found

      PS в чем проблема ?

  16. Добрый день. Спасибо за статью, очень полезная информация. Есть пару вопросов. Предположим есть 2 и более серверов на них установлен LAMP или LEMP и множество virtual hosts. Как это разделить логи, каждый сервер отдельно, каждый vh отдельно??? Есть встроенный Dashboard Apache его можно использовать через logstash, без модуля filebeat apache??

  17. Андрей

    Вообще не стартует с вашим конфигом, и главное логи не пишеь filebeat

    • Так у вас версия может другая или еще что-то. Надо осмысленно подходить к настройке, а не просто копировать. Все мои примеры взяты с рабочих серверов, а не придуманы гипотетически. На момент публикации они все были рабочие.

      • Андрей

        Понятное дело, что я не копирую конфиги бездумно!

        после добавления этих поле-
        fields:
        type: nginx_access
        fields_under_root: true

        отказывается стартовать filebeat

  18. Здравствуйте Владимир - POSTGRESQL MSSQL у вас есть готовый фильтр, - фомирования отчет как сделать Кибана
    - через rssylog как отправить лог схд, cisco ASA,exsi host и фильтровать logstash

  19. Здравствуйте Владимир logstash filter у меня несколько как нескольких фильтер создать например syslog,nginx,windows,cisco,mikrotik у меня не получается нескольки фильтр сделать

    • Вот пример нескольких фильтров с рабочего сервера:

      filter {
          if [type] == "nginx_access" {
              grok {
                  match => [ "message" , "%{COMBINEDAPACHELOG}+%{GREEDYDATA:extra_fields}"]
                  overwrite => [ "message" ]
                  }
              mutate {
                  convert => ["response", "integer"]
                  convert => ["bytes", "integer"]
                  convert => ["responsetime", "float"]
                  }
              geoip {
                  source => "clientip"
                  target => "geoip"
                  add_tag => [ "nginx-geoip" ]
                  }
              date {
                  match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
                  remove_field => [ "timestamp" ]
                  }
              useragent {
                  source => "agent"
                  }
          }
      
          else if [type] == "smb-audit" {
      	mutate {
      	    gsub => ["message","[\\|]",":"]
      	    gsub => ["message","  "," "]
      	    }
              grok {
                  match => [ "message" , "%{MONTH:syslog_month} %{MONTHDAY:syslog_day} %{TIME:syslog_time} %{HOSTNAME:srv_name} smbd_audit: XS:%{GREEDYDATA:user_name}:%{IP:user_ip}:%{WORD:share_name}:%{WORD:action}:%{DATA:sucess}:%{GREEDYDATA:path}"]
      	    overwrite => [ "message" ]
                  }
          }
      
          else if [type] == "smb-audit-xb" {
      	mutate {
      	    gsub => ["message","[\\|]",":"]
      	    gsub => ["message","  "," "]
      	    }
              grok {
                  match => [ "message" , "%{MONTH:syslog_month} %{MONTHDAY:syslog_day} %{TIME:syslog_time} %{HOSTNAME:srv_name} smbd_audit: %{IP:user_ip}:%{WORD:share_name}:%{WORD:action}:%{DATA:sucess}:%{GREEDYDATA:path}"]
      	    overwrite => [ "message" ]
                  }
          }
      
          else if [event_data][AccessMask] == "0x10000" or [event_data][AccessMask] == "0x10080" {
      	mutate {
      	    add_field => { "file_action" => "delete" }
      	    }
          }
          else if [event_data][AccessMask] == "0x2" or [event_data][AccessMask] == "0x6" {
      	mutate {
      	    add_field => { "file_action" => "write" }
      	    }
          }
          else if [event_data][AccessMask] == "0x1" {
      	mutate {
      	    add_field => { "file_action" => "read" }
      	    }
          }
          else if [host] == "10.1.4.19" or [host] == "10.1.5.1" or [host] == "10.1.4.31" {
      	mutate {
      	    add_tag => [ "mikrotik", "gateway" ]
      	}
          }
          else if [host] == "10.1.4.66" or [host] == "10.1.3.110" or [host] == "10.1.3.111" {
              mutate {
                  add_tag => [ "mikrotik", "wifi" ]
      	}
          }
          else if [host] == "10.1.4.14" or [host] == "10.1.5.33" or [host] == "10.1.3.11" {
              mutate {
                  add_tag => [ "mikrotik", "switch" ]
      	}
          }
      }
      • Здравствуйте Владимир! за логсташ фильтр спасибо! у меня еще вапрос есть winlogbeat фильтер есть?

        • Да, вот эта часть фильтра обрабатывает данные из winlogbeat с windows серверов.

              else if [event_data][AccessMask] == "0x10000" or [event_data][AccessMask] == "0x10080" {
          	mutate {
          	    add_field => { "file_action" => "delete" }
          	    }
              }
              else if [event_data][AccessMask] == "0x2" or [event_data][AccessMask] == "0x6" {
          	mutate {
          	    add_field => { "file_action" => "write" }
          	    }
              }
              else if [event_data][AccessMask] == "0x1" {
          	mutate {
          	    add_field => { "file_action" => "read" }
          	    }
              }
      • Андрей

        Владимир, добрый день, покажите пожалуйста как выглядит filebeat.yml со стороны сервера с nginx?

        • filebeat.inputs:
          - type: log
            enabled: true
            paths:
                - /var/log/nginx/*-access.log
            fields:
              type: nginx_access
            fields_under_root: true
            scan_frequency: 5s
          
          - type: log
            enabled: true
            paths:
                - /var/log/nginx/*-error.log
            fields:
              type: nginx_error
            fields_under_root: true
            scan_frequency: 5s
          
          output.logstash:
            hosts: ["10.1.4.114:5044"]
  20. Дмитрий

    Добрый день, Владимир. Благодарю за статью.

    Установил на VM Ubuntu 18.04, openjdk-8-jre, elasticsearch 7.7.0 из deb-пакета. Однако при попытке запустить службу elasticsearch получаю ошибку:

    user1@elastic:~$ sudo systemctl start elasticsearch
    Job for elasticsearch.service failed because the control process exited with error code.
    See "systemctl status elasticsearch.service" and "journalctl -xe" for details.
    user1@elastic:~$ systemctl status elasticsearch.service
    ● elasticsearch.service - Elasticsearch
       Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
       Active: failed (Result: exit-code) since Fri 2020-05-22 14:55:36 +05; 57s ago
         Docs: https://www.elastic.co
      Process: 2039 ExecStart=/usr/share/elasticsearch/bin/systemd-entrypoint -p ${PID_DIR}/elasticsearch.pid --quiet (code=exited, status=1/FA
     Main PID: 2039 (code=exited, status=1/FAILURE)
    
    мая 22 14:55:36 elastic systemd-entrypoint[2039]:         at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:161)
    мая 22 14:55:36 elastic systemd-entrypoint[2039]:         at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.
    мая 22 14:55:36 elastic systemd-entrypoint[2039]:         at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127)
    мая 22 14:55:36 elastic systemd-entrypoint[2039]:         at org.elasticsearch.cli.Command.main(Command.java:90)
    мая 22 14:55:36 elastic systemd-entrypoint[2039]:         at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:126)
    мая 22 14:55:36 elastic systemd-entrypoint[2039]:         at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92)
    мая 22 14:55:36 elastic systemd-entrypoint[2039]: For complete error details, refer to the log at /var/log/elasticsearch/elasticsearch.log
    мая 22 14:55:36 elastic systemd[1]: elasticsearch.service: Main process exited, code=exited, status=1/FAILURE
    мая 22 14:55:36 elastic systemd[1]: elasticsearch.service: Failed with result 'exit-code'.
    мая 22 14:55:36 elastic systemd[1]: Failed to start Elasticsearch.
    • Надо лог эластика смотреть - For complete error details, refer to the log at /var/log/elasticsearch/elasticsearch.log
      Там должна быть видна причина ошибки.

      • Дмитрий

        Спасибо. Попробовал на CentOS 8 - та же проблема. В логах вот что написано:

        [2020-05-25T12:09:16,647][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [localhost.localdomain] uncaught exception in thread [main]
        org.elasticsearch.bootstrap.StartupException: ElasticsearchException[Failure running machine learning native code. This could be due to running on an unsupported OS or distribution, missing OS libraries, or a problem with the temp directory. To bypass this problem by running Elasticsearch without machine learning functionality set [xpack.ml.enabled: false].]

        Судя по инфе на сайте эластика, корень проблемы в моём старом Phenom II X4, который не поддерживает инструкции SSE4.2:

        Вам не нужно настраивать какие-либо параметры для использования машинного обучения. Это включено по умолчанию.
        Машинное обучение использует инструкции SSE4.2, поэтому будет работать только на машинах, процессоры которых поддерживают SSE4.2. Если вы запускаете Elasticsearch на старом оборудовании, вы должны отключить машинное обучение (установив для xpack.ml.enabled значение false).
        Все эти параметры могут быть добавлены в файл конфигурации elasticsearch.yml. Динамические настройки также можно обновлять в кластере с помощью API настроек обновления кластера.
        Динамические настройки имеют приоритет над настройками в файле elasticsearch.yml.

  21. Здравствуйте, если можно более подробно разъяснить момент по сбору логов logstash от winlogbeats. Я не хочу разделять каждый виндовый сервер на свой индекс. И хотел бы чтобы все логи с виндовых серверов сыпались в один индекс. Как сконфигурировать winlogbeat.yml и output.conf в плане тегов. Я так понимаю что в winlogbeat.yml на каждом сервере нужно полностью убрать строку tags: ["winsrv"] а в output.conf

    output {
    if [type] == "wineventlog" {
    elasticsearch {
    hosts => "localhost:9200"
    index => "wineventlog-%{+YYYY.MM.dd}"
    }
    }
    else {
    elasticsearch {
    hosts => "localhost:9200"
    index => "unknown_messages"
    }
    }
    #stdout { codec => rubydebug }
    }

  22. Здравствуйте, Владимир!
    Спасибо большое за то, что потратили время и написали этот материал. Лишь благодаря вам удалось понять саму концепцию "как это все работает". После тестовой установки по вашему примеру, появилось полное понимание как я могу построить собственную систему сбора логов из своих источников.
    А до вашей статьи, даже с хорошим английским, с официально документацией, это было весьма сложно. Как вы верно написали - я полностью согласен: официальная документация неплохая, но сильно уж она разбросанная и чтобы в ней разобраться человеку, который с ELK никогда не работал - можно мозг сломать.
    Благодарю еще раз и желаю удачи в профессиональном направлении!
    С уважением

  23. А подскажите по какому принципу ELK удаляет старые данные? Где это настраивается?

    • Сам он ничего не удаляет. Надо настраивать. Либо самому запросы на удаление формировать, либо использовать какой-то софт. У меня в разделе есть статья по очистке elk с помощью curator.

  24. Cпасибо, как всегда интересно.

  25. В инструкции по установке Elasticsearch на Debian'e (да и на CentOS) на родном сайте написано что OpenJDK уже входит в дистрибутив (
    "Elasticsearch includes a bundled version of OpenJDK from the JDK maintainers (GPLv2+CE). To use your own version of Java, see the JVM version requirements"). И я так понимаю что отдельная установка Java не требуется. Сам проверял, работает.

    • Отлично. Хорошо, что они это сделали. Одной проблемой меньше.

    • И в дистрибутив Kibana входит OpenJDK. А вот в Logstash его кажись нет :( Вот прикол.

      • Не стал устанавливать отдельно JAVA, а в вашей инструкции по установке JAVA поменял /usr/lib/jvm/jre1.8.0_231 на /usr/share/elasticsearch/jdk. Т.е. прописал JAVA на JDK, входящий в поставку Elasticsearch. И Logstash пошёл!

  26. Дмитрий

    Доброго времени суток!

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

    [2020-03-19T10:46:39,215][DEBUG][logstash.agent ] Converging pipelines state {:actions_count=>1}
    [2020-03-19T10:46:39,230][DEBUG][logstash.agent ] Executing action {:action=>LogStash::PipelineAction::Create/pipeline_id:main}
    [2020-03-19T10:46:39,637][ERROR][logstash.agent ] Failed to execute action {:action=>LogStash::PipelineAction::Create/pipeline_id:main, :exception=>"LogStash::ConfigurationError", :message=>"Expected one of [ \\t\\r\\n], \"#\", [A-Za-z0-9_-], '\"', \"'\", [A-Za-z_], \"-\", [0-9], \"[\", \"{\", \"]\" at line 5, column 1 (byte 28) after filter\n{\ngrok {\nmatch => [\n", :backtrace=>["/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:47:in `compile_imperative'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:55:in `compile_graph'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:17:in `block in compile_sources'", "org/jruby/RubyArray.java:2580:in `map'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:14:in `compile_sources'", "org/logstash/execution/AbstractPipelineExt.java:161:in `initialize'", "org/logstash/execution/JavaBasePipelineExt.java:47:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:27:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:36:in `execute'", "/usr/share/logstash/logstash-core/lib/logstash/agent.rb:326:in `block in converge_state'"]}
    [2020-03-19T10:46:39,760][DEBUG][logstash.instrument.periodicpoller.os] Stopping
    [2020-03-19T10:46:39,759][DEBUG][logstash.agent ] Starting puma
    [2020-03-19T10:46:39,782][DEBUG][logstash.agent ] Trying to start WebServer {:port=>9600}
    [2020-03-19T10:46:39,785][DEBUG][logstash.instrument.periodicpoller.jvm] Stopping
    [2020-03-19T10:46:39,786][DEBUG][logstash.instrument.periodicpoller.persistentqueue] Stopping
    [2020-03-19T10:46:39,787][DEBUG][logstash.instrument.periodicpoller.deadletterqueue] Stopping
    [2020-03-19T10:46:39,810][DEBUG][logstash.agent ] Shutting down all pipelines {:pipelines_count=>0}
    [2020-03-19T10:46:39,841][DEBUG][logstash.api.service ] [api-service] start
    [2020-03-19T10:46:39,842][DEBUG][logstash.agent ] Converging pipelines state {:actions_count=>0}
    [2020-03-19T10:46:40,020][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
    [2020-03-19T10:46:44,926][INFO ][logstash.runner ] Logstash shut down.

    • У вас ошибка в конфиге:

      at line 5, column 1 (byte 28) after

      filter {
      grok {
      match =>

      • Дмитрий

        Вот не понятно в чем именно ошибка...

        filter
        {
        grok {
        match => [
        %{IP:client_ip} %{NOTSPACE:haproxy_timestamp} %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name} %{NOTSPACE:server_name} %{NUMBER:time_client_req:int} %{NUMBER:time_queue:int} %{NUMBER:time_backend_connect:int} %{NUMBER:time_server_response:int} %{NUMBER:time_duration:int} %{NUMBER:status_code:int} %{NUMBER:bytes_read:int} %{NOTSPACE:captured_request_cookie} %{NOTSPACE:captured_response_cookie} %{NOTSPACE:termination_state_with_cookie_status} %{NUMBER:actconn:int} %{NUMBER:feconn:int} %{NUMBER:beconn:int} %{NUMBER:srvconn:int} %{NUMBER:retries:int} %{NUMBER:srv_queue:int} %{NUMBER:backend_queue:int} %{GREEDYDATA:full_http_request} %{NOTSPACE:captured_response_headers}
        ]
        }
        }

        • Такие штуки муторно диагностировать, согласен :) Сам много времени терял. Но в выражении где-то ошибка 100%. Надо внимательно синтаксис проверять, все закрывающие скобки и т.д. Я всегда в итоге находил ошибку и исправлял.

  27. здравствуйте, нужна Ваша помощь,,, после запуска service kibana start на centos пишет что kibana is running curl -v * About to connect() to мой_сервер port 5601 (#0)
    * Trying мой_сервер... connected
    * Connected to мой_сервер (мой_сервер) port 5601 (#0)
    > GET / HTTP/1.1
    > User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.44 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
    > Host: мой_сервер:5601
    > Accept: */*
    >
    < HTTP/1.1 302 Found
    < location: /spaces/enter
    < kbn-name: kibana.local
    < kbn-license-sig: bf7bf1883eaa1463bf6d0422ee40fedf779ac9d39b2a32028a9c725472c11133
    < kbn-xpack-sig: 7db707bf28764972b882aff76746cc59
    < cache-control: no-cache
    < content-length: 0
    < Date: Wed, 18 Mar 2020 08:39:57 GMT
    < Connection: keep-alive
    <
    * Connection #0 to host мой_сервер left intact
    * Closing connection #0

    вывод log

    {"type":"response","@timestamp":"2020-03-18T08:39:57Z","tags":[],"pid":1452,"method":"get","statusCode":302,"req":{"url":"/","method":"get","headers":{"user-agent":"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.44 zlib/1.2.3 libidn/1.18 libssh2/1.4.2","host":"81.95.133.151:5601","accept":"*/*"},"remoteAddress":"81.95.133.151","userAgent":"81.95.133.151"},"res":{"statusCode":302,"responseTime":50,"contentLength":9},"message":"GET / 302 50ms - 9.0B"}

  28. Здравствуйте ! При копиривании публичного ключа репозитория elastica выдает такую ошибку (35) SSL connect error

  29. Zerox, доброго времени суток, хотелось бы выразить Вам большую благодарность за проделанную работу. Вы могли бы оставить счёт WM или альтернативный кошелек?
    И еще у меня есть к Вам вопрос. Стоит задача сбора логов с разных типов устройств, свитчи разных производителей, роутеры, принтеры, сервера в конце концов. Возможно ли это реализовать с помощью конфигурации, которая приведена в данной статье? В данный момент получается только собрать логи с windows через агента. Если на порт 5044 отправить логи, например, с микротика, то они не приходят в общий список. Может, у Вас есть конфигурационный файл, который позволил бы принимать логи со всех устройств? Был бы очень признателен за помощь.

  30. Дмитрий Волков

    После установки и настройки Kibana а именно после вот этого места (Теперь можно зайти в веб интерфейс по адресу http://10.1.4.114:5601) выдает сообщение "Kibana server is not ready yet". В файле kibana.yml ни каких изменений не вносил кроме server.host: который поменял на адрес своего сервера. Изменения вношу с помощью visual studio code подключаясь по SSH к серверу, так удобнее потому что он показывает синтаксические ошибки в yml файлах. Ни как не могу понять в чем дело, подскажите пожалуйста.

    • Обычно кибана показывает такое сообщение, когда ее только запустили и она еще не полностью загрузилась. Если сообщение не пропадает, надо смотреть логи кибаны и искать ошибки.

      • Дмитрий Волков

        Еще вопрос, возможно глупый. Не могу понять куда кибана пишет свой лог по умолчанию. По стандартному пути "/var/log/kibana" ничего нет, даже деректории kibana нет. И внутри конфигурационного файла не нашел путь до лога. Хотя в документации говориться что логи должны быть там .

        • Она по умолчанию в системный syslog пишет, так что ее логи надо смотреть в /var/log/messages. Не знаю, зачем они так сделали. Очень неудобно.

    • Дмитрий Волков

      В проблеме разобрался, по каким то причинам не стартует служба elasticsearch, поэтому и появлялось данное сообщение.

      • Вот кстати да. elasticsearch сам не стартует при запуске, пишет: elasticsearch.service: Start operation timed out. Terminating Приходится вручную перезапускать.

  31. Установка : 1:logstash-7.6.0-1.noarch 1/1
    Using provided startup.options file: /etc/logstash/startup.options
    Errno::ENOMEM: Cannot allocate memory - systemctl
    spawn at org/jruby/RubyProcess.java:1636
    spawn at org/jruby/RubyKernel.java:1667
    popen_run at /usr/share/logstash/vendor/jruby/lib/ruby/stdlib/open3.rb:202
    popen3 at /usr/share/logstash/vendor/jruby/lib/ruby/stdlib/open3.rb:98
    execute at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/detector.rb:74
    detect_systemd at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/detector.rb:29
    detect_platform at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/detector.rb:24
    detect at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/detector.rb:18
    setup_defaults at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/cli.rb:153
    execute at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/cli.rb:119
    run at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/clamp-0.6.5/lib/clamp/command.rb:67
    run at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/pleaserun-0.0.30/lib/pleaserun/cli.rb:114
    run at /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/clamp-0.6.5/lib/clamp/command.rb:132
    at /usr/share/logstash/lib/systeminstall/pleasewrap.rb:12
    Unable to install system startup script for Logstash.
    chmod: невозможно получить доступ к «/etc/default/logstash»: Нет такого файла или каталога
    warning: %post(logstash-1:7.6.0-1.noarch) scriptlet failed, exit status 1
    Non-fatal POSTIN scriptlet failure in rpm package 1:logstash-7.6.0-1.noarch
    Проверка : 1:logstash-7.6.0-1.noarch 1/1

    Установлено:
    logstash.noarch 1:7.6.0-1

    Установить, установилось, но...
    # systemctl enable logstash.service
    Failed to execute operation: No such file or directory

  32. Хочу собирать логи и анализировать с microtika . Вопрос как его подконектить к ELK стеку? по SMNP?

  33. Вячеслав

    rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
    curl: (7) Failed to connect to 2a04:4e42:400::734: Сеть недоступна
    ошибка: https://artifacts.elastic.co/GPG-KEY-elasticsearch: import read failed(2).

    как победить?

    • У вас подключение идет по ipv6, которое судя по всему не работает или не настроено. Отключите ipv6 на сервере.

  34. Дмитрий

    GeoLite2-City.mmdb.gz недоступен

  35. Алексей

    Приветствую всех! Может что то упустил в статье и поэтому хотел узнать есть winlogbeat а для Linux Centos какое название? Прям стыдно но не могу найти O_o
    Спасибо!

  36. Добрый день!

    Настроил ELK для снятия логов с Suricata. Данные получаю, визуализация есть, но не отображаются карты на дашборде, вообще никакие не работают. Появляется всплывающее сообщение вида:
    ----
    Unable to retrieve manifest from https://catalogue.maps.elastic.co/v7.2/manifest?elastic_tile_service_tos=agree&my_app_name=kibana&my_app_version=7.4.0&license=e1f60445-b8a0-46a1-81b1-4bd37e85f15f: Request to https://catalogue.maps.elastic.co/v7.2/manifest?elastic_tile_service_tos=agree&my_app_name=kibana&my_app_version=7.4.0&license=e1f60445-b8a0-46a1-81b1-4bd37e85f15f timed out
    ----
    Подскажите, пожалуйста, путь для решения данной проблемы.

    • Разобрался: в Firefox установлены плагины NoScript и AdBlock, они блокировали отрисовку карты. Открыл Kibana в Chrome и IE - все работает отлично.

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

  37. А какой context выставлять для SElinux для /etc/postfix/certs/cert.pem. У меня ругается dovecot на него, permission denied. В permissive вот что пишет: type=AVC msg=audit(1571069892.328:103): avc: denied { open } for pid=3372 comm="doveconf" path="/etc/postfix/certs/cert.pem" dev="vda1" ino=4941451 scontext=system_u:system_r:dovecot_t:s0 tcontext=unconfined_u:object_r:postfix_etc_t:s0 tclass=file permissive=1. Пробовал прописать dovecot_cert_t/dovecot_etc_t, не помогло, опять же как бы у postfix не пропал доступ.

  38. Добрый день! А что за плагин вставки кода в WP?

  39. После указания 127.0.0.1 в /etc/elasticsearch/elasticsearch.yml служба elasticsearch не запускается:

    elasticsearch.service - Elasticsearch
    Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled)
    Active: failed (Result: exit-code) since Sat 2019-08-10 00:06:24 CDT; 16s ago
    Docs: http://www.elastic.co
    Process: 2782 ExecStart=/usr/share/elasticsearch/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid --quiet (code=ex
    Main PID: 2782 (code=exited, status=1/FAILURE)

    Aug 10 00:06:24 debian elasticsearch[2782]: in 'reader', line 55, column 3:
    Aug 10 00:06:24 debian elasticsearch[2782]: network.host: 127.0.0.1

    • И ещё у меня почему то logstash не в какую не хочет слушать порт который я указываю.
      (фаервол офф, службу перезапускал , по первому вопросу тоже самое с фаерволом и перезапуском службы)

  40. Никита

    Доброго времени суток. Может я что-то не понимаю, может что-то делаю не так, но подскажите в чем может быть проблема.
    Устанавливаю данный стэк на виртуальную машину Centos 7. После установки Kibana не могу попасть на его веб-интерфейс, прописывал в файле конфигурации localhost, ip данного сервера, внешний ip сервера и делал проброс портов, ничего не помогает. Сервис перезапускал, работает нормально. Фаервол отключен.

    • Никита

      p.s. делаю все без ngnix
      *Если же у вас это тестовая установка, то можно обойтись без nginx. Для этого надо разрешить Кибана слушать внешний интерфейс и принимать подключения. Измените параметр server.host, указав ip адрес сервера, например вот так:

  41. Дмитрий

    Доброго времени суток!
    Запнулся на запуске logstash - упорно не читает конфиги в conf.d (а также ничего не пишет в лог) при запуске в качестве сервиса.

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

    systemctl status logstash пишет, что сервис работает, но порт 5044 не слушается.

    Обратил внимание на строку в /etc/systemd/system/logstash.service:
    ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash"

    Попытка выполнить /usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" провалилась.
    Исправил на /usr/share/logstash/bin/logstash --path.settings /etc/logstash
    В скрине запустилось нормально, порт слушался, в /var/log/logstash/logstash-plain.log запись идет.

    Исправил аналогично в /etc/systemd/system/logstash.service и сделал systemctl daemon-reload
    При попытке запуска демоном (systemctl start logstash) та же картина: видно, что сервис работает, но порт не слушается и в логе новых записей нет.

    ОС - CentOS Linux release 7.6.1810 (Core)

    Буду благодарен, если натолкнете на мысль, куда копать :)

    • Интересно. Я делал несколько установок по этой статье. Все прошли успешно. Возможно, в недавних обновлениях что-то сломали.
      Я не понял, что значит попытка выполнить провалилась. Какая ошибка была? В systemd указан неверный путь?

      • Дмитрий

        Там просто кавычки неправильно применены были. При ручном запуске такая картина:
        [root@elk ~]# /usr/share/logstash/bin/logstash "path.settings" "/etc/logstash"
        WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
        ERROR: Unknown command 'path.settings'

        See: 'bin/logstash --help'
        [ERROR] 2019-07-15 21:07:51.415 [main] Logstash - java.lang.IllegalStateException: Logstash stopped processing because of an error: (SystemExit) exit

      • Дмитрий

        Сорри, некорректно команду вставил, но от этого мало что изменилось.

        Вариант с кавычками (как было в /etc/systemd/system/logstash.service изначально):
        /usr/share/logstash/bin/logstash «--path.settings» «/etc/logstash»
        WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using —path.settings. Continuing using the defaults
        ERROR: Unknown command ‘path.settings’

        See: ‘bin/logstash —help’
        [ERROR] 2019-07-15 21:07:51.415 [main] Logstash — java.lang.IllegalStateException: Logstash stopped processing because of an error: (SystemExit) exit

        Вариант без кавычек (исправленный мною):

        [root@elk ~]# /usr/share/logstash/bin/logstash --path.settings /etc/logstash
        Sending Logstash logs to /var/log/logstash which is now configured via log4j2.properties
        [2019-07-15T21:12:00,219][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.8.1"}
        [2019-07-15T21:12:14,783][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
        [2019-07-15T21:12:15,774][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}}
        [2019-07-15T21:12:16,253][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>"http://localhost:9200/"}
        [2019-07-15T21:12:16,399][INFO ][logstash.outputs.elasticsearch] ES Output version determined {:es_version=>6}
        [2019-07-15T21:12:16,406][WARN ][logstash.outputs.elasticsearch] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>6}
        [2019-07-15T21:12:16,464][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//localhost:9200"]}
        [2019-07-15T21:12:16,494][INFO ][logstash.outputs.elasticsearch] Using default mapping template
        [2019-07-15T21:12:16,552][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}}
        [2019-07-15T21:12:17,713][INFO ][logstash.inputs.beats ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"}
        [2019-07-15T21:12:17,767][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#"}
        [2019-07-15T21:12:18,016][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
        [2019-07-15T21:12:18,055][INFO ][org.logstash.beats.Server] Starting server on port: 5044
        [2019-07-15T21:12:18,664][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}

        Не могу пока разобраться, почему даже исправленный вариант не работает корректно через systemd

  42. Спасибо за сей opus magnum.
    Подскажите, настроил все по вами приведенному мануалу. Дошел до создание индексов в kibana. Имеется куча патернов типа nginx-2018.11.15, но Next step не активен

  43. Кирилл

    Добрый день.

    Настроил стек ELK. В принципе все работает. Но после того как дал на него нагрузку, возникли проблемы с отображением информации в Kibana. В системе следующие серверы: 1 сервер -> мастер-нода (ОЗУ 16 Гб); 2 сервера -> 2 дата-ноды (64 ГБ, 64 Гб), 1 сервер -> Logstash, 1 сервер - Kibana. Связка с winlogbeat.
    При поиске (например 7 дней) возникает ошибка:
    SearchError: Request Timeout after 30000ms
    at http://ХХ.ХХ.ХХ.ХХХ:5601/bundles/commons.bundle.js:4:324908
    at processQueue (http://ХХ.ХХ.ХХ.ХХХ:5601/built_assets/dlls/vendors.bundle.dll.js:427:199687)
    at http://ХХ.ХХ.ХХ.ХХХ:5601/built_assets/dlls/vendors.bundle.dll.js:427:200650
    at Scope.$digest (http://ХХ.ХХ.ХХ.ХХХ:5601/built_assets/dlls/vendors.bundle.dll.js:427:210412)
    at http://ХХ.ХХ.ХХ.ХХХ:5601/built_assets/dlls/vendors.bundle.dll.js:427:212944
    at completeOutstandingRequest (http://ХХ.ХХ.ХХ.ХХХ:5601/built_assets/dlls/vendors.bundle.dll.js:427:64425)
    at http://ХХ.ХХ.ХХ.ХХХ:5601/built_assets/dlls/vendors.bundle.dll.js:427:67267
    Из настроек:
    -Xms32766m
    -Xmx32766m

    Есть идеи как полечить?

    • А что по нагрузке? Может железо не тянет? Я как вижу подобную ошибку, чищу индексы, отпускает.

  44. Дмитрий

    Добрый день.

    Установка java 8 на ubuntu больше не работает через apt install oracle-java8-installer - https://launchpad.net/~webupd8team/+archive/ubuntu/java

    Теперь только ручная установка, либо из другого репозитория. После установки еще нужно будет вручную задать JAVA_PATH в elasticsearch.yml

  45. Не понял:
    "Оказалось, что модули filebeat работают только в том случае, если вы отправляете данные напрямую в elasticsearch.", когда в следующем пункте устанавливаем filebeat для отправки логов в logstash.
    Имеется ввиду, когда filebeat установлен на одной машине с elasticsearch?

  46. Камнеежка

    Спасибо. Всё отлично. Всё работает.

  47. Виктор

    [root@server ~]# wget https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-6.6.0.noarch.rpm
    --2019-03-23 20:33:01-- https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-6.6.0.noarch.rpm
    Resolving download.elastic.co (download.elastic.co)... 151.101.38.217, 2a04:4e42:9::729
    Connecting to download.elastic.co (download.elastic.co)|151.101.38.217|:443... connected.
    HTTP request sent, awaiting response... 404 Not Found
    2019-03-23 20:33:02 ERROR 404: Not Found.

    С чем может быть связана ошибка?

  48. Я конечно извиняюсь за тупой вопрос.
    А какие мощнасти сервера нужны чтобы поставить это все?

    • Напрямую зависит от нагрузки и от суммарного объема логов. Стартануть можно спокойно с 2 CPU, 4 Gb и обычного SATA диска.

  49. Uze 4 den nie mogu reshyt problemku, mozet tut umnye ludi pidskazut, za ranee spasibo:
    curl localhost:5044
    curl: (56) Recv failure: Connection reset by peer

    • Сервис на порту 5044 сбрасывает соединение. Причин может быть огромное количество, почему это происходит. Надо логи сервиса смотреть.

  50. в конфиге nginx в параметре "server_name kibana.site.ru" --- нет в конце ;

  51. Добавьте пожалуйста в статью:
    Необходимой утилиты нет в системе. Установим htpasswd на centos:

    # yum install -y httpd-tools

  52. все бы хорошо, но после запуска и добавления 3-х хостов вылезла ошибка
    elasticsearch - Attempted to send a bulk request to elasticsearch, but no there are no living connections in the connection pool. Perhaps Elasticsearch is unreachable or down? {:error_message=>"No Available connections", :class=>"LogStash::Outputs::ElasticSearch::HttpClient::Pool::NoConnectionAvailableError", :will_retry_in_seconds=>64}

    • при запуске elasticsearch выходит такая ошибка
      main ERROR RollingFileManager (/logdb/log/elasticsearch/elasticsearch_index_search_slowlog.log) java.io.FileNotFoundException: /logdb/log/elasticsearch/elasticsearch_index_search_slowlog.log (Permission denied) java.io.FileNotFoundException: /logdb/log/elasticsearch/elasticsearch_index_search_slowlog.log (Permission denied)
      main ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender
      main ERROR RollingFileManager (/logdb/log/elasticsearch/elasticsearch_deprecation.log) java.io.FileNotFoundException: /logdb/log/elasticsearch/elasticsearch_deprecation.log (Permission denied) java.io.FileNotFoundException: /logdb/log/elasticsearch/elasticsearch_deprecation.log (Permission denied)
      main ERROR RollingFileManager (/logdb/log/elasticsearch/elasticsearch_audit.log) java.io.FileNotFoundException: /logdb/log/elasticsearch/elasticsearch_audit.log (Permission denied) java.io.FileNotFoundException: /logdb/log/elasticsearch/elasticsearch_audit.log (Permission denied)

      • Тут явно какие-то локальные проблемы с правами, под которыми запускается elasticsearch. Разбирайтесь в этом направлении.

        • Добрый день, с права разобрался, теперь другая проблема
          [WARN ] 2019-01-28 16:06:43.907 [Ruby-0-Thread-10: :1] elasticsearch - Attempted to resurrect connection to dead ES instance, but got an error. {:url=>"http://localhost:9200/", :error_type=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :error=>"Elasticsearch Unreachable: [http://localhost:9200/][Manticore::SocketException] Connection refused (Connection refused)"}
          [ERROR] 2019-01-28 16:07:08.271 [Ruby-0-Thread-16: :1] elasticsearch - Attempted to send a bulk request to elasticsearch, but no there are no living connections in the connection pool. Perhaps Elasticsearch is unreachable or down? {:error_message=>"No Available connections", :class=>"LogStash::Outputs::ElasticSearch::HttpClient::Pool::NoConnectionAvailableError", :will_retry_in_seconds=>64}

          • Доброе утро, оказалось что Elasticsearch не может обработать огромное колличество логов и из за этого уходит в down, я пытался логировать Oracle WebLogic Server установленный на Windows Server 2008 R2. Теперь наверное придется выборку сделать по eventid.

            • Спасибо за инфу. По идее, перегрузку можно видеть по нагрузке на систему. Если проц и память все заняты, то по-любому, надо что-то делать.

              • Добрый день, как раз нагрузки на систему не было, а дело решилось тем что необходимо было в файле /etc/elasticsearch/jvm.options изменить параметры -Xms8g -Xmx8g, на моей ОС общей памяти 16Гб, и поэтому поставил 8Гб в параметрах. Так же у меня каталоги были отличные от дефолтных для данных и логов поэтому и другие строчки так же изменил это -XX:HeapDumpPath= , -XX:ErrorFile= , 8:-Xloggc: .

  53. Балин Омавель

    Насколько разумно использовать в этом стеке Grafana вместо Kibana? Первая уже поднята и активно используется и второй фронт кажется избыточным (если конечно настройка графаны внутри стека не займет очень много времени). У вас есть опыт?

    • Опыта нет, но насколько мне известно, графана не сможет продублировать функционал kibana полностью. Вопрос в том, что вы хотите получить на выходе. Настроить дашборды в графане получится, но в кибана функционал не ограничивается только дашбордами. Мне кажется, разумнее всего поставить таки elk полностью с kibana, все настройки делать в ней. А в графану вывести то, что нужно визуализировать. Сама по себе установка kibana не представляет никакой сложности. Я не вижу ни одной причины, почему бы ее не поставить.

  54. Добрый день, возможно ли данной связкой настроить систему логирования и мониторинга для системной информации. syslog. в крации есть парк машин 150+ серверов. и я хочу реализовать хорошую и удобную систему отслежки логов.

    • Да, конечно можно. Можно текстовые логи забирать с сервера с помощью filebeat, а можно сразу в logstash передавать напрямую с системного rsyslog, настроив на нем передачу логов на удаленный syslog сервер.

  55. добрый день,

    что с местом, сколлько надо под это дело? понимаю, что многое зависит от количества собираемого и т.д., но скажем есть какой-то минимум же...?
    спасибо!

    • Так о каком минимуме речь? Это же база данных. Сама она занимает немного. Занимают места данные, поэтому как можно заранее сказать, сколько они будут занимать? Даже примерно не прикинешь. У меня есть несколько установок, но там везде очень разные данные и информация оттуда будет неактуальна для других систем.

  56. Спасибо за статью. Есть пра предложений в плане удобства. В полях где написаны комманды не писать знак # а то при копировании всей строки попадает иногда. И в тексте где есть какие-то пути конфигов к конце после названия не нужно ставить точку (ну или с пробелом) а то копируя текст попадает и точка на которую не всегда обращаешь внимание, в результате создается не тот файл который должен быть. lof.conf. заменить на log.conf . Как вариант.

    • Замечания справедливые, особенно первое. Мне самому не нравится, но не знаю, как все это теперь исправить, чтобы во всем сайте было единообразие. К тому же консоль бывает разная. # приветствие в обычной консоли linux, а иногда заходишь в консоль mysql - там будет >, где-то $ и т.д. То есть консоли иногда надо отличать. В идеале знак консоли вынести из самой строки для копирования, но я не знаю, как это сделать. Надо со стилями разбираться и какой-то мод для wordpress писать, чтобы потом в редакторе можно было этим управлять. В общем, пока останется так, как есть :)

  57. Привет! сделал всё по статьи, всё получилось, но только лдокально, чьё то с удалённых linux/win сервера не придут данные, на linux глянул в логах filebeat там есть куча инфо, но в лог файла написано. что в elasticsearch не включено xpack.monitoring, а если мы добавили xpack.monitoring на filebeat на удалённных хостах. а может быть и на самом сервер добавить?

    уже несколько дней делаю по разным стстьям много чего получается, но только локально, нучну делать удалённо не получается, а эта может быть связано с https(nginx) ?

    • xpack.monitoring влияет только на сам мониторинг и больше ни на что. Можно включить, посмотреть на него. Я потестил и выключил, так как использую zabbix везде. Тут лишний мониторинг только ресурсы потреблять будет.

  58. Привет! Сделал как написано, всё чётко получилось, спасибо бро, продолжай!!! :) ты Сепрмен. Сделал с Nginx круто

    • Будет много статей по этой теме. У меня уже прилично систем заведены на ELK Stack со своими дашбордами. Надо только время свободное на написание статей.

      • Валерий

        все таки очень хочется анализировать трафик с mikrotika не могу соединить воедино эти две системы

        • Следующая статья про микротик будет. У меня уже настроено это все и работает.

          • Валерий

            Тоже разобрался и настроил, но не могу понять как настроить визуализацию

            • Что визуализировать хочется? Я не парсил логи микротика, так как они очень разные от разных событий. Под все парсинг писать не захотелось. Мне лично достаточно просто текста логов в elk.

              • Аноним

                Не один день бьюсь над адекватным фильтром, и не могу понять как заставить заменять ip адреса на DNS с серва гугл например и как это происходит, находил только отдаленные сайты что есть такой дашборд NetFlow но как он ставиться и куда не понял, вообще хотел собрать что-то подобное netflow analyzer, у которого при получение netflow v9 происходил разбор по DNS с рабочими ссылками.

                • Мне кажется, что elk не подходящий для этого инструмент. Но могу ошибаться. В любом случае, тут не будет готового или простого решения. Нужно самому колхозить по месту. Причем много и упорно :)

  59. Исправьте, пожалуйста:
    Закончили настройку logstash. Запускаем его:

    # systemctl enable logstash.service

    на systemctl start logstash.service

  60. Алексей

    Тоже недавно стал изучать ELK. Сейчас стоит версия 6.3.2. По статье очень советую не добавлять реппозитории, а использовать rpm\deb пакеты т.к. при обновлении внезапно может появится новая версия и все ваши индексы будут грустить и находится в потерянном времени, так было со мной, когда с версии 6.3.2 все обновилось до 6.4. Для полного дополнения к статье, надо еще добавить один момент, который все упускают, но вспоминают о нем, спустя месяц или 2 (в зависимости от объема данных). Это очистка данных. В официальной документации рекомендуют использовать curator. ставится командой pip install elasticsearch-curator

    далее заводим конфиг /etc/curator
    файлик /etc/curator/config.yml
    client:
    hosts:
    - 127.0.0.1: 9200
    url_prefix:
    use_ssl: False
    certificate:
    client_cert:
    client_key:
    ssl_no_validate: True
    http_auth:
    timeout: 30
    master_only: False

    logging:
    loglevel: INFO
    logfile:
    logformat: default
    blacklist: ['elasticsearch', 'urllib3']

    файлик /etc/curator/action.yml

    actions:
    1:
    action: close
    description: close indices
    options:
    delete_aliases: False
    timeout_override:
    continue_if_exception: True
    disable_action: False
    filters:
    -
    filtertype: age
    source: name
    direction: older
    timestring: '%Y.%m.%d'
    unit: days
    unit_count: 45
    exclude:
    2:
    action: delete_indices
    description: delete indices
    filters:
    -
    filtertype: age
    source: name
    direction: older
    timestring: '%Y.%m.%d'
    unit: days
    unit_count: 50
    exclude:

    и самое главное
    crontab -e
    0 0 * * * /usr/local/bin/curator --config /etc/curator/config.yml /etc/curator/action.yml
    Не стал в комменте писать, что за что отвечает, при желании есть официальная документация. А то слишком большой будет и меня забанит.

    • Спасибо за полезную информацию. Про curator я сразу нашел инфу, но до чистки еще не дошел, не накопил объем. А по поводу обновлений грустно. Неужели в версиях нет обратной совместимости со старыми индексами? В таком случае можно просто через yum или apt заблокировать обновления elasticsearch.

      • Алексей

        Разработчики на сайте предупреждают о том, что индексы могут быть разные и могут быть проблемы, поэтому лучше знать это заранее, пока все это не обросло своими доработками и алерт скриптами. По шаблонам и визуализациям, уверен, что вы пробовали встроенные визуализации которые пишутся на kibana. В общем, чтобы долго не искать, есть хороший способ, на сам сервер ставите например тот же filebeat и потом выполняете команду filebeat setup --dashboards, но по мне, проще рисовать самому и поближе поймешь как это делать и потом становиться интереснее. Поэтому по визуализациям, тот кто поймет какие события для него важны и необходимо собирать статистику, сам нарисует таблицы, диаграммы и пироги которые будут необходимы.

        • Да, согласен. Я пробовал и смотрел готовые дашборды. Не подошло и не понравилось ничего. Для себя сам нарисовал все с актуальной информацией. На эту тему будут статьи. Одна уже в черновиках, ждет публикации.

  61. Владимир

    Пока что бегло просмотрел, но уже возник такой вопрос - это все настраивается на заранее подготовленном на базе web-сервера nginx, php-fpm, php7 или хватит базовой настройки без поднятия web-сервера?

    • Web сервер как таковой не нужен. Kibana сама по себе веб сервер. Но для удобства используется Nginx. Php-fpm не нужен вообще. Тут все на яве работает.

  62. Николай

    а можно ли собирать логи с Микротика?

    • Конечно можно. Я напишу об этом, как руки дойдут. У меня есть микротики, которые надо завести на elasticsearch. В настоящее время бьюсь над ошибками :) Не так то это просто управлять elasticsearch. Очень много нюансов. Уже несколько раз все индексы удалял, чтобы ошибки исправить.

      • Николай

        с нетерпением буду ждать статью

        • Если сильно хочется, ждать не обязательно. Можно собирать логи в обычные файлы и анализировать filebeat. Как отправлять логи микротика в файл я уже писал - https://serveradmin.ru/mikrotik-logirovanie-na-udalennyiy-server-rsyslog/

        • Алексей

          По микротику, можно просто добавить в /etc/logstash/conf.d/ файл 02-beats-input-mikrotik.conf с следующим содержанием

          input {
          tcp {
          type => "syslog"
          port => 54714
          }
          }

          input {
          udp {
          type => "syslog"
          port => 54714
          }
          }

          порт можете выбрать какой захотите. перезапустиьт logstash. И соответственно на самом микротике указать адрес сервера логов с портов. потом появятся новые индексы. Это простой конфиг, возможно будет желание "попилить" на более мелкие шарды, но для типовых задач: кто в какое время залогинился и что изменил в конфиге, логирование на правила, вполне хватит.

          • Я, кстати, это себе сделал уже. Пытался как-то распарсить логи через grok, но не получилось. Не занимались подобным?

          • Николай

            создал файл с указанными параметрами. в кебана у меня так и не появляется файл логов. все дела по инструкции. только без включения nginx. уже все конфиги пересмотрел - не пойму где затык

            • Алексей

              /etc/logstash/conf.d/40-output.conf
              output {
              elasticsearch {
              hosts => ["localhost:9200"]
              sniffing => true
              manage_template => false
              index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
              document_type => "%{[@metadata][type]}"
              }
              }

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

          • Подскажите в чем может быть проблема?

            systemctl restart logstash.service && tail -f /var/log/logstash/logstash-plain.log
            [2020-07-02T02:25:28,532][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
            [2020-07-02T02:25:33,461][INFO ][logstash.runner ] Logstash shut down.
            [2020-07-02T02:25:51,277][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.8.0", "jruby.version"=>"jruby 9.2.11.1 (2.5.7) 2020-03-25 b1f55b1a40 OpenJDK 64-Bit Server VM 25.252-b09 on 1.8.0_252-8u252-b09-1~deb9u1-b09 +indy +jit [linux-x86_64]"}
            [2020-07-02T02:25:52,621][ERROR][logstash.agent ] Failed to execute action {:action=>LogStash::PipelineAction::Create/pipeline_id:main, :exception=>"LogStash::ConfigurationError", :message=>"Expected one of [ \\t\\r\\n], \"#\", [A-Za-z0-9_-], '\"', \"'\", [A-Za-z_], \"-\", [0-9], \"[\", \"{\" at line 3, column 9 (byte 23) after input {\ntcp {\ntype => ", :backtrace=>["/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:58:in `compile_imperative'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:66:in `compile_graph'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:28:in `block in compile_sources'", "org/jruby/RubyArray.java:2577:in `map'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:27:in `compile_sources'", "org/logstash/execution/AbstractPipelineExt.java:181:in `initialize'", "org/logstash/execution/JavaBasePipelineExt.java:67:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:43:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:52:in `execute'", "/usr/share/logstash/logstash-core/lib/logstash/agent.rb:342:in `block in converge_state'"]}
            [2020-07-02T02:25:52,956][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
            [2020-07-02T02:25:57,842][INFO ][logstash.runner ] Logstash shut down.
            [2020-07-02T02:26:15,679][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.8.0", "jruby.version"=>"jruby 9.2.11.1 (2.5.7) 2020-03-25 b1f55b1a40 OpenJDK 64-Bit Server VM 25.252-b09 on 1.8.0_252-8u252-b09-1~deb9u1-b09 +indy +jit [linux-x86_64]"}
            [2020-07-02T02:26:16,946][ERROR][logstash.agent ] Failed to execute action {:action=>LogStash::PipelineAction::Create/pipeline_id:main, :exception=>"LogStash::ConfigurationError", :message=>"Expected one of [ \\t\\r\\n], \"#\", [A-Za-z0-9_-], '\"', \"'\", [A-Za-z_], \"-\", [0-9], \"[\", \"{\" at line 3, column 9 (byte 23) after input {\ntcp {\ntype => ", :backtrace=>["/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:58:in `compile_imperative'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:66:in `compile_graph'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:28:in `block in compile_sources'", "org/jruby/RubyArray.java:2577:in `map'", "/usr/share/logstash/logstash-core/lib/logstash/compiler.rb:27:in `compile_sources'", "org/logstash/execution/AbstractPipelineExt.java:181:in `initialize'", "org/logstash/execution/JavaBasePipelineExt.java:67:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:43:in `initialize'", "/usr/share/logstash/logstash-core/lib/logstash/pipeline_action/create.rb:52:in `execute'", "/usr/share/logstash/logstash-core/lib/logstash/agent.rb:342:in `block in converge_state'"]}
            [2020-07-02T02:26:17,298][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
            [2020-07-02T02:26:22,194][INFO ][logstash.runner ] Logstash shut down.
            [2020-07-02T02:26:54,268][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.8.0", "jruby.version"=>"jruby 9.2.11.1 (2.5.7) 2020-03-25 b1f55b1a40 OpenJDK 64-Bit Server VM 25.252-b09 on 1.8.0_252-8u252-b09-1~deb9u1-b09 +indy +jit [linux-x86_64]"}

            • У вас ошибка в конфиге

              ConfigurationError», :message=>»Expected one of [ \\t\\r\\n], \»#\», [A-Za-z0-9_-], ‘\»‘, \»‘\», [A-Za-z_], \»-\», [0-9], \»[\», \»{\» at line 3, column 9 (byte 23) after input

              в 3-й строке.

              • Сергей У.

                не хочешь обновить статью по ELK Stack (Elastic Kibana)

                а то нпифигна не робит, и интерфейс у свежей версии совсем другой..

  63. Вроде есть logstash-input-imap, есть ли опыт сним?

  64. Можно ли каким-то образом сделать чтоб этот стек хранил не логи, а письма. Сейчас у меня почти все системы(UTM, Netwrix, Zabbix ect) отправляют на мой ящик тонны писем. Может можно натравить их на ELK Stack, хранить, парсить, и смотреть там?

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

Ваш адрес email не будет опубликован.

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.