Логування в мікросервісах — це не просто трюк, щоб здаватися професіоналом, це життєво важливий інструмент. Коли ваші мікросервіси починають переписуватися між собою, ви маєте бути впевнені, що можете легко відстежити, де щось пішло не так. Уявіть, що ваш код — це театр коду, а логи — це щось на кшталт щоденника закулісного життя. 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!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ