Уявіть собі мікросервісний зоопарк з десятками або навіть сотнями незалежних сервісів. Що робити, якщо один з них раптом перестане працювати коректно? Як зрозуміти, що саме зламалося, де і чому? Ось тут логування виходить на сцену. Логи — це ваші сліди на піску мікросервісної пустелі.
Логування в мікросервісах особливо важливе, бо:
- У кожного мікросервісу своя база даних, логіка і конфігурація.
- Мікросервіси взаємодіють один з одним через мережу, тому треба відслідковувати виклики і відповіді.
- Помилки можуть траплятися в кожному зі сервісів — потрібні дані, щоб швидко знайти джерело проблеми.
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.
Порядок переоприділення логування
- Налаштування на рівні
application.ymlабоapplication.properties. - Конфігурація через XML-файл
logback.xml(якщо потрібен складніший формат логів). - Змінні оточення, якщо треба тимчасово змінити рівень логування в продакшені.
Моніторинг мікросервісів
Одного логування інколи недостатньо. Нам також варто стежити за станом мікросервісу, споживанням ресурсів і іншими важливими параметрами. Для цього 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. Потрібно:
- Додати логування в основні методи (створення замовлення, оновлення, видалення).
- Зберігати логи у файл, щоб їх можна було відправляти в централізовану систему логування.
Приклад 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 легко інтегрується з цим стеком.
Практика для студентів
- Додайте логування у всі основні сервіси вашого додатку:
- Використовуйте рівні
INFO,DEBUGіERROR. - Зберігайте логи у файл і перевірте його вміст.
- Використовуйте рівні
- Налаштуйте Actuator:
- Увімкніть
/actuator/health. - Перевірте доступність метрик через
/actuator/metrics.
- Увімкніть
- (Опційно) Інтегруйте Actuator з Prometheus і візуалізуйте метрики в Grafana.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ