Многие я думаю читали о применении Elasticsearch, Logstash и Kibana для сбора и анализа логов, но часто статьи начинаются с длинного мануала как поднять сервисы ELK и заставить работать их совместно.
Здесь я хочу рассказать о быстром старте с помощью Docker.
Напишу заранее, что статья ориентирована на тех кто уже знаком с Docker и имеет желание поднять стек ELK для ознакомления или будущего использования в продуктиве. А для тех кто не знает нужен ли им ELK, рекомендую причитать статью Kibana-мать или Зачем вам вообще нужны логи?.
Итак, в идеале задача сводится к тому, чтобы найти контейнер с ELK на hub.docker.com и запустить его. Предлагаю так и сделать с некоторыми доработками. В примере рассмотрим отправку логов nginx в elasticSearch.
Аббревиатура сервисов ELK предусматривает следующие задачи:
1) Обработку поступающих данных и доставку их в Elasticsearch — за это отвечает сервис Logstash
2) Поисковый движок и интерфейс доступа к данным- за это отвечают сам Elasticsearch и Kibana
Но по хорошему Logstash не должен отвечать за доставку данных. Доставку данных делегируем четвертому сервису- Fealbeat.
Общая схема работы выглядит следующим образом:
В сети может находится различное количество сервисов, с которых необходимо собирать данные и сервис Filebeat является провайдером логов для сервиса Logstash.
Другими словами я веду к тому, что нам необходимо заиметь еще один контейнер с сервисом Filebeat.
Приступим к делу. Я настоятельно рекомендую вам пользоваться сервисом Docker Compose- описывать параметры в одном файле формата YAML, гораздо удобнее чем каждый раз выполнять команды с параметрами. А на этапе отладки запустить и остановить придется не 1 раз.
1. Создадим папку с проектом, например myElk и создадим там файл следующего имени docker-compose.yml, который мы будем дополнять.
2. Ищем и находим контейнер с filebeat. Я рекомендую взять вот этот olinicola/filebeat или выполнить docker pull olinicola/filebeat
Настройка контейнера с filebeat заключается в подготовке конфигурационного файла в формате YAML для сервиса filebeat.
У нас он будет выглядеть следующим образом:
prospectors:
-
paths:
- "/etc/logs/nginx/access.log"
document_type: nginx-access
-
paths:
- "/var/log/nginx/error.log"
document_type: nginx-error
output:
logstash:
hosts: ["elk:5044"]
tls:
certificate_authorities:
- /etc/pki/tls/certs/logstash-beats.crt
timeout: 15
file:
path: "/tmp/filebeat"
Если коротко, то берем логи nginx с определенного места сервера и отправляем их на ELK сервер, который готов принимать от нас сообщения на порт 5044.
В данном конфигурационном файле «elk»- имя прилинкованного контейнера- подробнее ниже.
Я также дополнительно указал выгрузку в файл, для более удобной отладке на этапе запуска.
На данном этапе вы уже можете дополнить docker-compose.yml следующим кодом:
version: '2'
services:
filebeat:
build: .
image: [ваш imageId образа filebeat]
volumes:
- /path/to/myElk/log/nginx:/etc/logs/nginx # логи nginx
- /path/to/myElk/filebeat:/etc/filebeat
- /path/to/myElk/filebeat/tmp:/tmp/filebeat
Вы уже можете запустить поднять контейнер командой docker-compose up. И посмотреть как при изменении файла access.log данные будут отправляться в файл "/tmp/filebeat", только на данном этапе еще нет контейнера elk, поэтому output logstash лучше закомментировать.
3. Ок, нас появился первый контейнер с filebeat. Теперь нам нужен второй контейнер с ELK. Идем на hub.docker.com и находим sebp/elk или выполняем команду docker pull sebp/elk.
Настройка контейнера ELK.
Единственное, что нужно настроить здесь это logstash, причем тут 2 варианта: а) оставить все как есть и это будет работать, так как logstash в данном контейнере уже настроен на получение логов nginx сервера.
Однако после того как вы запуститесь вам захочется пойти по пути б)-то есть настроить логи так как нужно именно вам. Потому что от того как будут переданы логи в elasticsearch вам будет более или менее удобно анализировать данные, приходящие с nginx.
Итак поясню файлы конфигурации logstash. Файлы логов, которые нас интересуют следующие:
Входные параметры:
02-beats-input.conf — можно не трогать
input {
beats {
port => 5044
ssl => true
ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
ssl_key => "/etc/pki/tls/private/logstash-beats.key"
}
}
Здесь мы видим, что сервис готов принимать данные по порту 5044.
Выходные параметры:
30-output.conf — можно не трогать
output {
elasticsearch {
hosts => ["localhost"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
stdout { codec => rubydebug }
}
Самое интересное- преобразование данных. По умолчанию файл 11-nginx.conf выглядит так
filter {
if [type] == "nginx-access" {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
}
}
Но возможно после того как вы наиграетесь с шаблоном NGINXACCESS вы захотите обработать ваши логи именно так как нужно вам.
Для этого вам нужно будет изменять секцию filter. Там может быть несколько параметров — очень хорошо описано здесь Собираем, парсим и отдаём логи с помощью Logstash.
От себя хочу добавить, что для отладки grok фильтров хорошо подходит следующий сервис: Grok Debugger
3. Компоновка 2х контейнеров.
Здесь я настоятельно рекумендую вам пользоваться сервисом Docker Compose- описывать параметры в одном файле формата YAML, гораздо удобнее чем каждый раз выполнять команды с параметрами. А на этапе отладки запустить и остановить придется не 1 раз.
Для этого вам необходимо создать папку с проектом, например myElk и создать там файл следующего имени docker-compose.yml и например следующего содержания:
version: '2'
services:
filebeat:
build: .
image: [ваш imageId образа filebeat]
volumes:
- /path/to/myElk/log/nginx:/etc/logs/nginx # логи nginx
- /path/to/myElk/filebeat:/etc/filebeat
- /path/to/myElk/filebeat/tmp:/tmp/filebeat
- /path/to/myElk/filebeat/certs:/etc/pki/tls/certs
links:
- "elk"
depends_on:
- "elk"
#entrypoint: ./time-to-start.sh
elk:
image: [ваш imageId образа elk]
ports:
- "5601:5601" #kibana
- "9200:9200" #elastic
- "5044:5044" #logstash beats filebeat
Данный конфигурационный файл описывает два контейнера и их взаимосвязь, а т
Пробуйте запустить контейнер, если все ОК, то по адресу localhost:5601 вы увидите первую страницу Kibana, где вам нужно будет выбрать первый index, он будет сформирован вида filebeat-[дата], наберите filebeat и если данные начали поступать, то он будет сформирован автоматически.
Для тех кто запускает docker на mac- вам необходимо будет дополнительно пробросить порты через проброс портов VirtualBox, чтобы localhost:5601 был доступен на хостовой машине.
Автор: robertsz