Вы когда-нибудь пытались найти ошибку, просматривая уйму текстовых файлов с логами? Представьте, что таких файлов пару десятков, и они все разбросаны по разным серверам. Чтобы упростить такие вот ситуации и придумали ELK-стек. ELK — это трио инструментов: Elasticsearch, Logstash и Kibana, которые помогают собирать, хранить, анализировать и визуализировать логи.
В микросервисной архитектуре каждый сервис генерирует свои логи. Если возникнет ошибка, мы захотим быстро и легко найти, где именно она произошла, просмотреть цепочку событий, а также понять, почему всё пошло не так. Централизованное логирование позволяет:
- Собирать логи со всех микросервисов в одном месте.
- Удобно анализировать логи, используя запросы (а не "ручной просмотр").
- Быстро находить взаимодействия между сервисами и выяснять причину проблем.
- Визуализировать данные для лучшего понимания.
Что такое ELK-стек?
Давайте разберем каждую из трех букв ELK:
- Elasticsearch — это хранилище данных и поисковый движок. Оно находит нужные логи в огромных объемах данных за доли секунды. Также поддерживает запросы на основе языка JSON.
- Logstash — это обработчик данных. Он собирает логи из различных источников, фильтрует или преобразует их и отправляет в Elasticsearch. Можно сказать, что он "курьер" для логов.
- Kibana — это инструмент визуализации. Он берет данные из Elasticsearch и рисует графики, диаграммы и таблицы, чтобы вы могли понять происходящее без боли.
Когда эти три инструмента работают вместе, они превращают унылые текстовые логи в мощный инструмент для анализа.
Установка и настройка ELK
Elasticsearch
Начнем с установки Elasticsearch, который послужит нашим логовым хранилищем.
- Скачайте и установите Elasticsearch.
- После установки откройте файл конфигурации
elasticsearch.yml, который можно найти в папкеconfig. - Проверьте, чтобы Elasticsearch был доступен локально:
network.host: 127.0.0.1 http.port: 9200 - Запустите Elasticsearch:
После запуска сервис будет доступен по адресу http://localhost:9200.
./bin/elasticsearch
Logstash
Теперь настроим второй компонент — Logstash. Это мостик, который будет принимать логи от нашего Spring Boot приложения и отправлять их в Elasticsearch.
- Скачайте и установите Logstash.
- Создайте файл конфигурации
logstash.conf:input { beats { port => 5044 } } output { elasticsearch { hosts => ["localhost:9200"] } }- В input мы указываем, что хотим принимать логи через порт
5044. - В output мы настраиваем Logstash на отправку данных в Elasticsearch.
- В input мы указываем, что хотим принимать логи через порт
- Запускаем Logstash:
./bin/logstash -f logstash.conf
Kibana
Последний шаг — установка и запуск Kibana, чтобы мы могли визуализировать данные.
- Скачайте и установите Kibana.
- Настройте Kibana, отредактировав файл
kibana.yml:server.port: 5601 server.host: "localhost" elasticsearch.hosts: ["http://localhost:9200"] - Запустите Kibana:
Теперь интерфейс Kibana доступен по адресу http://localhost:5601.
./bin/kibana
Итак, основные компоненты установлены. Теперь мы можем интегрировать наше Spring Boot приложение с ELK.
Интеграция микросервисов с ELK
Настройка логгирования в Spring Boot
Самое время заставить ваше приложение отправлять логи прямо в Logstash.
- Откройте
pom.xmlи добавьте следующие зависимости:<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>7.4</version> </dependency> - Настройте
logback-spring.xmlдля отправки логов в Logstash:<configuration> <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender"> <destination>127.0.0.1:5044</destination> <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> </appender> <root level="INFO"> <appender-ref ref="LOGSTASH" /> </root> </configuration> Перезапустите приложение. Теперь логи будут автоматически направляться в Logstash, а оттуда — в Elasticsearch.
Проверка логов
- Откройте интерфейс Kibana (http://localhost:5601).
- Перейдите в раздел Discover.
- Настройте индекс (например,
logstash-*) и увидите логи из вашего приложения.
Практическая настройка ELK для микросервисов
Давайте представим, что у нас есть два микросервиса:
- User Service — отвечает за управление данными пользователей.
- Order Service — отвечает за обработку заказов.
Шаги:
- Добавьте Logstash-конфигурацию в каждый сервис, как было показано ранее.
- Настройте оба сервиса так, чтобы они отправляли логи в Logstash.
- Используйте Kibana для анализа логов:
- Найдите запросы, проходящие через оба сервиса.
- Если запросы связаны между собой (например, Trace ID из Sleuth), отследите их путь.
О чем стоит помнить?
Логирование — это мощный инструмент, но с ним связаны некоторые вызовы:
- Ресурсоемкость. Генерация и обработка большого объема логов может замедлить систему.
- Безопасность. Убедитесь, что конфиденциальные данные (например, пароли) не попадают в логи.
- Хранение. Elasticsearch имеет ограничения на объем данных, поэтому старые логи нужно архивировать или удалять.
Теперь, когда ваши микросервисы оснащены централизованным логированием через ELK, вы сможете спать гораздо спокойнее. Ведь диагностика проблем станет вопросом секунд, а визуализация логов в Kibana обязательно вызовет восторг у вашей команды! (Или хотя бы у вашего тимлида.)
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ