І знову поговоримо про логи.
У реальному світі логи можуть включати:
- Перехоплення помилок та винятків.
- Запис ключових операцій, наприклад, завершення транзакцій.
- Відстеження активності користувачів.
- Аналіз продуктивності через часові позначки та деталі запитів.
Поєднання логування й Actuator дозволяє отримати не тільки дані про поточний стан додатка, але й історичну інформацію для аналізу, що робить систему максимально прозорою.
Увімкнення логування через Actuator
Spring Boot Actuator забезпечує зручний інтерфейс для взаємодії з логами твого додатка. Це робиться через ендпоінт /actuator/loggers. За його допомогою можна подивитися поточні налаштування логування або навіть змінити рівень логування на лету!
Додаємо залежності
По-перше, переконайся, що в твоєму проєкті підключені потрібні залежності. Додай Actuator, якщо ще не зробив цього:
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
build.gradle:
implementation 'org.springframework.boot:spring-boot-starter-actuator'
Налаштування логування
Spring Boot Actuator дозволяє керувати логуванням через файл конфігурації application.properties або application.yml. Наприклад, можна включити ендпоінт /loggers за допомогою такого рядка:
management.endpoints.web.exposure.include=loggers
Цей параметр робить ендпоінт доступним для запитів. Можеш перевірити список усіх зареєстрованих логгерів або змінити їхній рівень логування на ходу.
Що показує ендпоінт /actuator/loggers?
Коли відкрити URL /actuator/loggers, побачиш JSON-об’єкт, що містить інформацію про всі зареєстровані логгери Spring.
Приклад структури JSON:
{
"levels": ["OFF", "ERROR", "WARN", "INFO", "DEBUG", "TRACE"],
"loggers": {
"ROOT": {
"configuredLevel": "INFO",
"effectiveLevel": "INFO"
},
"com.example.myapp": {
"configuredLevel": "DEBUG",
"effectiveLevel": "DEBUG"
}
}
}
Тут:
levels— допустимі рівні логування.loggers— поточні логгери з їхніми налаштуваннями. ЛоггерROOTзастосовується до всього додатка, якщо інше явно не вказано.
Зміна рівня логування
Ти можеш динамічно змінювати рівень логування для будь-якого компонента додатка через API. Наприклад, щоб змінити рівень логування для пакета com.example.myapp на TRACE, виконай HTTP-запит:
PUT-запит:
PUT /actuator/loggers/com.example.myapp
Content-Type: application/json
{
"configuredLevel": "TRACE"
}
Переконайся, що зміни застосувалися, через GET /actuator/loggers/com.example.myapp.
Налаштування рівня логування
Логування в Spring Boot базується на популярних бібліотеках логування, таких як Logback, Log4j і Java Util Logging. Давай подивимось, як можна налаштувати логування для різних компонентів додатка.
Приклад application.properties:
# Рівень логування за замовчуванням
logging.level.root=INFO
# Рівень логування для власного пакету
logging.level.com.example.myapp=DEBUG
# Логування SQL-запитів (якщо використовується JPA)
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
Ці рівні логування можна змінювати через /actuator/loggers.
Практика: Логування контролерів
Розглянемо практичний сценарій: додамо кілька логів у наш навчальний проєкт і відстежимо їх через Actuator.
Приклад контролера з логами
Контролер:
package com.example.myapp.controller;
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 HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@GetMapping("/hello")
public String sayHello() {
logger.info("INFO: Handling /hello request");
logger.debug("DEBUG: Additional debug information");
logger.error("ERROR: Simulated error log (just an example)");
return "Hello, Spring Boot with Actuator!";
}
}
У цьому прикладі ми додали логи рівнів INFO, DEBUG і ERROR. Тепер можеш перевіряти ці події в лог-файлі додатка та керувати їх видимістю через Actuator.
Налаштування логування для безпеки
Логи безпеки особливо корисні при використанні Spring Security. Ось як можна налаштувати логування для аналізу вдалих і невдалих спроб входу в систему:
Приклад application.properties:
logging.level.org.springframework.security=DEBUG
Тепер запити, пов’язані з авторизацією й аутентифікацією, будуть логуватися. Це може допомогти виявити підозрілу активність.
Практичне завдання: робота з логами
Коротке завдання:
- Налаштуй у своєму проєкті ендпоінт
/actuator/loggers. - Додай логи з різними рівнями (
INFO,WARN,DEBUG) в один із контролерів. - Змініть рівень логування на ходу через
PUT-запит до/actuator/loggers. - Перевір, як зміни відображаються в логах.
Захист логів за допомогою Spring Security
Важливо пам’ятати, що дані в логах можуть бути чутливими. Налаштуй захист ендпоінта /actuator/loggers, щоб обмежити доступ лише для авторизованих користувачів.
Приклад сек’юрної конфігурації:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests
.requestMatchers("/actuator/loggers/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.httpBasic();
return http.build();
}
}
Тепер лише користувачі з роллю ADMIN зможуть змінювати рівень логування або переглядати конфігурацію через /actuator/loggers.
Додатково: аналіз логів
Коли поєднаєш Actuator із зовнішніми системами, такими як ELK (Elasticsearch, Logstash, Kibana), логи стануть ще потужнішими. Можеш налаштовувати трасування запитів, які привели, наприклад, до помилки, і візуалізувати це.
Підсумок
Тепер твій додаток не тільки логує помилки, а й дозволяє гнучко керувати налаштуваннями логування через Actuator і API. Це допомагає мінімізувати час на пошук і виправлення проблем, а також дає більше контролю над моніторингом додатка.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ