JavaRush /Курси /Модуль 5. Spring /Лекція 180: Логування та моніторинг мікросервісів на ранн...

Лекція 180: Логування та моніторинг мікросервісів на ранніх етапах розробки

Модуль 5. Spring
Рівень 12 , Лекція 9
Відкрита

Уявіть собі мікросервісний зоопарк з десятками або навіть сотнями незалежних сервісів. Що робити, якщо один з них раптом перестане працювати коректно? Як зрозуміти, що саме зламалося, де і чому? Ось тут логування виходить на сцену. Логи — це ваші сліди на піску мікросервісної пустелі.

Логування в мікросервісах особливо важливе, бо:

  • У кожного мікросервісу своя база даних, логіка і конфігурація.
  • Мікросервіси взаємодіють один з одним через мережу, тому треба відслідковувати виклики і відповіді.
  • Помилки можуть траплятися в кожному зі сервісів — потрібні дані, щоб швидко знайти джерело проблеми.

Spring Boot спрощує налаштування логування завдяки інтеграції з популярними бібліотеками, такими як SLF4J і Logback.


Основи логування за допомогою SLF4J і Logback

SLF4J (Simple Logging Facade for Java) — це фасад для різних інструментів логування. Він допомагає абстрагувати код від конкретної реалізації (наприклад, Logback, Log4j) і дозволяє легко замінити одну бібліотеку на іншу, не змінюючи код програми.

У Spring Boot Logback використовується "з коробки". Не треба додавати додаткові залежності — достатньо прописати конфігурації і правильно користуватися логерами.

Створення логера

Припустимо, у нас є CustomerService, і ми хочемо логувати дії в цьому класі:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class CustomerService {
    private static final Logger logger = LoggerFactory.getLogger(CustomerService.class);

    public void handleCustomerRequest(String customerId) {
        logger.info("Опрацьовую запит для клієнта: {}", customerId);

        try {
            // Логіка обробки
            logger.debug("Обробляю дані клієнта для ID: {}", customerId);
        } catch (Exception e) {
            logger.error("Помилка під час обробки даних клієнта", e);
        }
    }
}

Рівні логування

Рівні логів дозволяють задати важливість повідомлень:

  • TRACE — найдетальніше логування. Використовується рідко.
  • DEBUG — для розробки, щоб бачити деталі виконання програми.
  • INFO — для загальних відомостей про виконання.
  • WARN — попередження про можливі проблеми.
  • ERROR — помилки, що призводять до збоїв або некоректної роботи.

Налаштування логування через application.yml

Налаштовувати логування можна прямо в application.yml з використанням Spring Boot:

logging:
  level:
    root: INFO # Загальне логування
    com.example: DEBUG # Логування для конкретного пакету
  file:
    name: logs/app.log # Вивід логів у файл
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" # Шаблон для console логів

Тепер усі наші DEBUG-логи для пакету com.example будуть відображатися в консолі і записуватися у файл logs/app.log.

Порядок переоприділення логування

  1. Налаштування на рівні application.yml або application.properties.
  2. Конфігурація через XML-файл logback.xml (якщо потрібен складніший формат логів).
  3. Змінні оточення, якщо треба тимчасово змінити рівень логування в продакшені.

Моніторинг мікросервісів

Одного логування інколи недостатньо. Нам також варто стежити за станом мікросервісу, споживанням ресурсів і іншими важливими параметрами. Для цього Spring Boot надає потужний інструмент — Spring Boot Actuator.

Що таке Spring Boot Actuator?

Actuator — це набір вбудованих endpoints, які надають інформацію про стан додатку. З його допомогою можна:

  • Дізнатися про стан серверних залежностей (наприклад, бази даних).
  • Отримати метрики продуктивності (час відповіді, використання пам'яті і т.д.).
  • Перевірити, які endpoints готові для взаємодії.

Підключення Spring Boot Actuator

Додайте залежність в pom.xml:


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

Actuator автоматично активує кілька endpoints. Давайте їх налаштуємо.

Налаштування Actuator в application.yml

Увімкнемо основні метрики:


management:
  endpoints:
    web:
      exposure:
        include: "*" # Дозволяємо всі endpoints
  endpoint:
    health:
      show-details: always # Показувати деталі стану сервісу
  metrics:
    enabled: true # Увімкнути метрики

Тепер, запустивши додаток, ми можемо звертатися до різних endpoints Actuator (наприклад, /actuator/health).

Endpoints Actuator

Ендпоінт Опис
/actuator/health Перевірка стану сервісу
/actuator/metrics| Метрики продуктивності
/actuator/env Інформація про змінні оточення
/actuator/loggers| Динамічне управління рівнями логів

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

curl http://localhost:8080/actuator/health

Результат:


{
  "status": "UP"
}

Практичне застосування: Налаштування логування і моніторингу

1. Налаштування логів для мікросервісу

Припустимо, ми розробляємо сервіс управління замовленнями OrderService. Потрібно:

  1. Додати логування в основні методи (створення замовлення, оновлення, видалення).
  2. Зберігати логи у файл, щоб їх можна було відправляти в централізовану систему логування.

Приклад OrderService з логуванням:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class OrderService {
    private static final Logger logger = LoggerFactory.getLogger(OrderService.class);

    public void createOrder(String orderId) {
        logger.info("Створюю замовлення з ID: {}", orderId);
    }

    public void updateOrder(String orderId) {
        logger.debug("Оновлюю замовлення з ID: {}", orderId);
    }

    public void deleteOrder(String orderId) {
        logger.warn("Видаляю замовлення з ID: {}", orderId);
    }
}

Налаштуємо вивід логів у файл через application.yml:

logging:
  level:
    root: INFO
    com.example.orderservice: DEBUG
  file:
    name: logs/orderservice.log

2. Увімкнення метрик через Actuator

Додамо інформацію про час роботи сервісу (uptime) через Actuator. Перевіримо його доступність через /actuator/metrics.

Приклад виклику:

curl http://localhost:8080/actuator/metrics/jvm.uptime

Реальні проблеми і як їх уникнути

  • Багато шуму в логах? Використовуйте рівні логування (DEBUG тільки для розробки).
  • Файли логів надто великі? Налаштуйте ротацію логів через logback.xml.
  • Недостатньо метрик? Інтегруйте Actuator з такими інструментами, як Prometheus і Grafana, для комплексного моніторингу.

Для централізованого логування в реальних проєктах часто використовують стек ELK (Elasticsearch, Logstash, Kibana). Spring Boot легко інтегрується з цим стеком.


Практика для студентів

  1. Додайте логування у всі основні сервіси вашого додатку:
    • Використовуйте рівні INFO, DEBUG і ERROR.
    • Зберігайте логи у файл і перевірте його вміст.
  2. Налаштуйте Actuator:
    • Увімкніть /actuator/health.
    • Перевірте доступність метрик через /actuator/metrics.
  3. (Опційно) Інтегруйте Actuator з Prometheus і візуалізуйте метрики в Grafana.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ