Логирование в микросервисах — это не просто трюк, чтобы казаться профессионалом, это жизненно важный инструмент. Когда ваши микросервисы начинают вести переписку друг с другом, вы должны быть уверены, что можете легко отследить, где что-то пошло не так. Представьте, что ваш код — это театр кода, и логи — это всё равно что дневник закулисной жизни. ELK-стек (Elasticsearch, Logstash, Kibana) делает это дневник удобным для чтения, поиска и анализа.
Почему именно ELK?
Чем чаще ваши приложения общаются, тем более хаотичным становится процесс мониторинга логов. ELK решает эту проблему с помощью:
- Elasticsearch — мощной базы данных, заточенной под поисковые запросы.
- Logstash — универсального транспортировщика логов.
- Kibana — системы визуализации логов через красивенькие дашборды.
А теперь самое главное: вместо чтения JSON-аутпутов в вашем терминале вы сможете «любоваться графиками» в Kibana. Звучит привлекательно? Тогда приступим!
Подготовительные шаги
Установка компонентов ELK-стека
- Elasticsearch:
Скачиваем Elasticsearch и запускаем его локально. Команда для запуска после распаковки:Убедитесь, что он запущен, посетив./bin/elasticsearchhttp://localhost:9200в браузере. - Logstash:
Скачиваем Logstash и готовим его к бою. Logstash нужно будет настроить с помощью конфигурационного файла, об этом чуть позже. - Kibana:
Скачиваем Kibana. После запуска Kibana будет доступна наhttp://localhost:5601.
Подготовка Spring Boot приложения
Создадим Spring Boot приложение с базовой структурой для логирования. Добавим следующие зависимости в наш pom.xml (или build.gradle):
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
Почему Log4j2? Он гибкий и прекрасно интегрируется с Logstash.
Настройка проекта для логирования
Конфигурация log4j2
Создайте файл log4j2.xml в директории src/main/resources. Пример конфигурации:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<!-- Консольный аппендер -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level %logger{36} - %msg%n" />
</Console>
<!-- Logstash аппендер -->
<Socket name="Logstash" host="localhost" port="5044">
<JsonLayout complete="true" compact="true" eventEol="true" />
</Socket>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console" />
<AppenderRef ref="Logstash" />
</Root>
</Loggers>
</Configuration>
Здесь мы настроили:
- Логи выводятся в консоль.
- Логи отправляются на Logstash через сокет.
Настройка Logstash
Создайте файл logstash.conf:
input {
tcp {
port => 5044
codec => json
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "application-logs"
}
stdout {
codec => rubydebug
}
}
Объясним, что тут происходит:
input— Logstash ожидает данные по TCP на порту5044.output— логи сохраняются в Elasticsearch в индексapplication-logsи выводятся в консоль для любопытных глаз.
Запустите Logstash с этим конфигурационным файлом:
./bin/logstash -f logstash.conf
Проверка работы
- Написание кода: В вашем Spring Boot приложении добавьте парочку логов:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class LogController { private final Logger logger = LoggerFactory.getLogger(LogController.class); @GetMapping("/log") public String generateLog() { logger.info("Привет, ELK! Это мой первый лог."); logger.error("Houston, у нас проблема!"); return "Лог отправлен"; } } - Запуск: Поднимите Spring Boot приложение, открывайте браузер, и введите:
http://localhost:8080/log - Проверка в Kibana:
- Зайдите в Kibana (
http://localhost:5601). - Перейдите в
Management -> Index Patterns. - Настройте индексный шаблон для
application-logs. - Перейдите в
Discover, и вы увидите все свои прекрасные логи.
- Зайдите в Kibana (
Полезные советы
- Всегда тестируйте конфигурацию с небольшими логами перед внедрением в production. Неработающее логирование в реальной системе — это боль.
- Убедитесь, что ваш Logstash может выдерживать нагрузку. Если нет, используйте кластеризацию или альтернативы, например Fluentd.
- Настраивайте ротацию индексов в Elasticsearch, чтобы кластеры не захлёбывались от гигабайтов данных.
Теперь, когда вы прошли этот этап, у вас есть мощный инструмент не только для сбора логов, но и для поиска проблем в ваших микросервисах. В следующей лекции мы рассмотрим мониторинг метрик с помощью Prometheus, а пока наслаждайтесь исследованием своих логов в ELK!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ