Перейти к основному содержимому

Изменение уровня ведения журнала во время выполнения для приложения Spring Boot

· 8 мин. чтения

1. Введение

В этом руководстве мы рассмотрим способы изменения уровня ведения журнала приложения Spring Boot во время выполнения. Как и многие другие вещи, Spring Boot имеет встроенную функцию ведения журнала , которая настраивает ее для нас. Мы собираемся изучить, как настроить уровни ведения журнала работающего приложения.

Мы рассмотрим три способа сделать это: с помощью конечной точки регистраторов Spring Boot Actuator , функции автоматического сканирования в Logback и, наконец, с помощью инструмента Spring Boot Admin .

2. Пружинный привод загрузки

Мы собираемся начать с использования конечной точки / loggers Actuator для отображения и изменения нашего уровня ведения журнала. Конечная точка / loggers доступна по адресу act/loggers , и мы можем получить доступ к конкретному регистратору, добавив его имя как часть пути.

Например, мы можем получить доступ к корневому регистратору по URL-адресу http://localhost:8080/actuator/loggers/root .

2.1. Настраивать

Давайте начнем с настройки нашего приложения для использования Spring Boot Actuator.

Во-первых, нам нужно добавить зависимость Spring Boot Actuator Maven в наш файл pom.xml :

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

Начиная с Spring Boot 2.x, большинство конечных точек по умолчанию отключены , поэтому нам также потребуется включить конечную точку / loggers в нашем файле application.properties :

management.endpoints.web.exposure.include=loggers
management.endpoint.loggers.enabled=true

Наконец, давайте создадим контроллер с рядом операторов ведения журнала, чтобы мы могли видеть результаты наших экспериментов:

@RestController
@RequestMapping("/log")
public class LoggingController {
private Log log = LogFactory.getLog(LoggingController.class);

@GetMapping
public String log() {
log.trace("This is a TRACE level message");
log.debug("This is a DEBUG level message");
log.info("This is an INFO level message");
log.warn("This is a WARN level message");
log.error("This is an ERROR level message");
return "See the log for details";
}
}

2.2. Использование конечной точки / loggers

Давайте запустим наше приложение и получим доступ к нашему API журнала:

curl http://localhost:8080/log

Затем давайте проверим журналы, где мы должны найти три оператора регистрации:

2019-09-02 09:51:53.498  INFO 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController      : This is an INFO level message
2019-09-02 09:51:53.498 WARN 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController : This is a WARN level message
2019-09-02 09:51:53.498 ERROR 12208 --- [nio-8080-exec-1] c.b.s.b.m.logging.LoggingController : This is an ERROR level message

Теперь давайте вызовем конечную точку / loggers Actuator, чтобы проверить уровень ведения журнала для нашего пакета com.foreach.spring.boot.management.logging :

curl http://localhost:8080/actuator/loggers/com.foreach.spring.boot.management.logging
{"configuredLevel":null,"effectiveLevel":"INFO"}

Чтобы изменить уровень ведения журнала, мы можем отправить запрос POST к конечной точке / loggers :

curl -i -X POST -H 'Content-Type: application/json' -d '{"configuredLevel": "TRACE"}'
http://localhost:8080/actuator/loggers/com.foreach.spring.boot.management.logging
HTTP/1.1 204
Date: Mon, 02 Sep 2019 13:56:52 GMT

Если мы снова проверим уровень ведения журнала, мы должны увидеть, что он установлен на TRACE :

curl http://localhost:8080/actuator/loggers/com.foreach.spring.boot.management.logging
{"configuredLevel":"TRACE","effectiveLevel":"TRACE"}

Наконец, мы можем повторно запустить наш API журнала и увидеть наши изменения в действии:

curl http://localhost:8080/log

Теперь давайте снова проверим журналы:

2019-09-02 09:59:20.283 TRACE 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController      : This is a TRACE level message
2019-09-02 09:59:20.283 DEBUG 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is a DEBUG level message
2019-09-02 09:59:20.283 INFO 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is an INFO level message
2019-09-02 09:59:20.283 WARN 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is a WARN level message
2019-09-02 09:59:20.283 ERROR 12208 --- [io-8080-exec-10] c.b.s.b.m.logging.LoggingController : This is an ERROR level message

3. Автоматическое сканирование журнала

По умолчанию наши приложения Spring Boot используют библиотеку ведения журналов Logback. Давайте теперь посмотрим, как мы можем воспользоваться функцией автоматического сканирования Logback, чтобы изменить уровень ведения журнала.

Во-первых, давайте добавим некоторую конфигурацию Logback, поместив файл с именем logback.xml в наш каталог src/main/resources :

<configuration scan="true" scanPeriod="15 seconds">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>

<logger name="com.foreach.spring.boot.management.logging" level="INFO" />

<root level="info">
<appender-ref ref="STDOUT" />
</root>
</configuration>

Ключевая информация содержится в первой строке файла logback.xml . Установив для атрибута сканирования значение true , мы говорим Logback проверить файл конфигурации на наличие изменений. По умолчанию автосканирование происходит каждые 60 секунд.

Установка scanPeriod на 15 секунд говорит о том, что он перезагружается каждые 15 секунд, поэтому нам не нужно ждать так долго во время наших экспериментов.

Давайте попробуем это, запустив приложение и снова вызвав наш API журнала:

curl http://localhost:8080/log

Наш вывод должен отражать уровень ведения журнала INFO для нашего пакета:

10:21:13.167 [http-nio-8080-exec-1] INFO  c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:21:13.167 [http-nio-8080-exec-1] WARN c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:21:13.168 [http-nio-8080-exec-1] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message

Теперь давайте изменим наш регистратор com.foreach.spring.boot.management.logging в logback.xml на TRACE :

<logger name="com.foreach.spring.boot.management.logging" level="TRACE" />

Через 15 секунд давайте повторно запустим API журнала по адресу http://localhost:8080/log и проверим вывод нашего журнала:

10:24:18.429 [http-nio-8080-exec-2] TRACE c.b.s.b.m.logging.LoggingController - This is a TRACE level message
10:24:18.430 [http-nio-8080-exec-2] DEBUG c.b.s.b.m.logging.LoggingController - This is a DEBUG level message
10:24:18.430 [http-nio-8080-exec-2] INFO c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:24:18.430 [http-nio-8080-exec-2] WARN c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:24:18.430 [http-nio-8080-exec-2] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message

4. Администратор весенней загрузки

Третий способ, которым мы собираемся изменить уровень ведения журнала, — это инструмент Spring Boot Admin. Чтобы использовать Spring Boot Admin, нам нужно создать серверное приложение и настроить наше приложение как клиент.

4.1. Приложение администратора

Чтобы изменить наш уровень ведения журнала с помощью Spring Boot Admin, нам нужно настроить новое приложение для использования в качестве нашего сервера администрирования. Для этого мы можем использовать Spring Initialzr .

Давайте добавим последний spring-boot-admin-starter-server в наш pom.xml:

<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.4.1</version>
</dependency>

Подробные инструкции по настройке сервера администрирования см. в разделе 2 нашего руководства по администрированию Spring Boot . Кроме того, Раздел 4 включает информацию, необходимую для настройки безопасности, поскольку мы будем защищать нашего клиента.

4.2. Конфигурация клиента

Когда у нас есть сервер администратора, нам нужно настроить наше приложение в качестве клиента.

Во-первых, давайте добавим зависимость Maven для spring-boot-admin-starter-client :

<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.4.1</version>
</dependency>

Нам также понадобится безопасность между нашим сервером администратора и клиентом, поэтому давайте добавим стартер Spring Boot Security :

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.4.0</version>
</dependency>

Далее нам нужно внести некоторые изменения в конфигурацию наших файлов application.properties .

Сервер администратора работает на порту 8080, поэтому давайте начнем с того, что изменим наш порт и дадим приложению имя:

spring.application.name=spring-boot-management
server.port=8081

Теперь давайте добавим конфигурацию, необходимую для доступа к серверу:

spring.security.user.name=client
spring.security.user.password=client

spring.boot.admin.client.url=http://localhost:8080
spring.boot.admin.client.username=admin
spring.boot.admin.client.password=admin

spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name}
spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password}

Сюда входит URL-адрес, на котором работает сервер администрирования, и информация для входа как для клиента, так и для сервера администрирования.

Наконец, нам нужно включить конечные точки привода / health, /info и /metrics , чтобы сервер администратора мог определять статус клиента:

management.endpoints.web.exposure.include=httptrace,loggers,health,info,metrics

Поскольку изменение уровней регистратора — это операция POST, нам также необходимо добавить небольшую конфигурацию безопасности, чтобы игнорировать защиту CSRF для конечных точек привода:

@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/actuator/**");
}

4.3. Использование администратора Spring Boot

После настройки давайте запустим и клиентское, и серверное приложение, используя mvn spring-boot:run .

Давайте начнем с доступа к нашему API журнала по адресу http://localhost:8081/log , ничего не меняя. Теперь у нас включена система безопасности, поэтому нас попросят войти в систему, используя учетные данные, указанные в application.properties .

Наш вывод журнала должен отображать сообщения журнала, которые отражают наш уровень ведения журнала INFO:

09:13:23.416 [http-nio-8081-exec-10] INFO  c.b.s.b.m.logging.LoggingController - This is an INFO level message
09:13:23.416 [http-nio-8081-exec-10] WARN c.b.s.b.m.logging.LoggingController - This is a WARN level message
09:13:23.416 [http-nio-8081-exec-10] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message

Теперь давайте войдем на сервер Spring Boot Admin и изменим наш уровень ведения журнала. Перейдем по адресу http://localhost:8080 и войдем в систему с учетными данными администратора. Мы попадем в список зарегистрированных приложений, где мы должны увидеть наше приложение управления весенней загрузкой :

./740c00576f187e5d220ef30d07b4f791.jpg

Давайте выберем spring-boot-management и просмотрим регистраторы с помощью левого меню:

./5bb447582892d46e65612b10facd7c79.jpg

Регистратор com.foreach.spring.boot.management.logging настроен на INFO. Давайте изменим его на TRACE и перезапустим наш API логов:

./2efc2ce6bd579c9b9cb2c49d2067d17f.jpg

Наш вывод журнала теперь должен отражать новый уровень регистратора:

10:13:56.376 [http-nio-8081-exec-4] TRACE c.b.s.b.m.logging.LoggingController - This is a TRACE level message
10:13:56.376 [http-nio-8081-exec-4] DEBUG c.b.s.b.m.logging.LoggingController - This is a DEBUG level message
10:13:56.376 [http-nio-8081-exec-4] INFO c.b.s.b.m.logging.LoggingController - This is an INFO level message
10:13:56.376 [http-nio-8081-exec-4] WARN c.b.s.b.m.logging.LoggingController - This is a WARN level message
10:13:56.376 [http-nio-8081-exec-4] ERROR c.b.s.b.m.logging.LoggingController - This is an ERROR level message

5. Вывод

В этой статье мы рассмотрели различные способы управления уровнем ведения журнала во время выполнения. Мы начали с использования встроенных функций приводов. После этого мы воспользовались функцией автосканирования из Logback.

Наконец, мы узнали, как использовать Spring Boot Admin для мониторинга и изменения уровней ведения журнала в зарегистрированном клиентском приложении.

Пример кода для использования приводов и Logback, а также для настройки Spring Boot Admin доступен на GitHub.