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

Установка уровня журнала в Spring Boot при тестировании

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

1. Обзор

В этом руководстве мы узнаем, как установить уровень журнала при запуске тестов для приложения Spring Boot .

Хотя мы можем в основном игнорировать журналы, пока проходят наши тесты, выбор правильного уровня журнала может иметь решающее значение, если нам нужно диагностировать неудачные тесты .

2. Важность логарифмического уровня

Правильная настройка уровня журнала может сэкономить нам много времени.

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

Чтобы добиться нужного количества деталей, мы можем точно настроить уровни ведения журнала пакетов нашего приложения. Если мы обнаружим, что пакет Java более важен для наших тестов, мы можем присвоить ему более низкий уровень, например DEBUG . Точно так же, чтобы избежать слишком большого шума в наших журналах, мы можем настроить более высокий уровень, скажем, INFO или ERROR, для менее важных пакетов.

Давайте рассмотрим различные способы установки уровня ведения журнала.

3. Настройки ведения журнала в application.properties

Если мы хотим изменить уровень журнала в наших тестах, есть свойство, которое мы можем установить в src/test/resources/ application.properties :

logging.level.com.foreach.testloglevel=DEBUG

Это свойство устанавливает уровень журнала специально для пакета com.foreach.testloglevel .

Точно так же мы можем изменить уровень ведения журнала для всех пакетов, установив корневой уровень журнала :

logging.level.root=INFO

Теперь давайте попробуем наши настройки ведения журнала, добавив конечную точку REST, которая записывает некоторые журналы:

@RestController
public class TestLogLevelController {

private static final Logger LOG = LoggerFactory.getLogger(TestLogLevelController.class);

@Autowired
private OtherComponent otherComponent;

@GetMapping("/testLogLevel")
public String testLogLevel() {
LOG.trace("This is a TRACE log");
LOG.debug("This is a DEBUG log");
LOG.info("This is an INFO log");
LOG.error("This is an ERROR log");

otherComponent.processData();

return "Added some log output to console...";
}

}

Как и ожидалось, если мы вызовем эту конечную точку в наших тестах , мы сможем увидеть логи DEBUG из TestLogLevelController :

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

Установить такой уровень журнала довольно просто, и мы обязательно должны сделать это, если наши тесты аннотированы с помощью @SpringBootTest . Однако, если мы не будем использовать эту аннотацию, нам придется настроить уровень журнала по-другому.

3.1. Настройки ведения журнала на основе профиля

Хотя размещение настроек в src/test/application.properties будет работать в большинстве ситуаций, могут быть случаи, когда мы хотели бы иметь разные настройки для одного теста или группы тестов .

В этом случае мы можем добавить профиль Spring в наш тест , используя аннотацию ActiveProfiles :

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = TestLogLevelApplication.class)
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
@ActiveProfiles("logging-test")
public class TestLogLevelWithProfileIntegrationTest {

// ...

}

Затем наши настройки ведения журнала будут находиться в специальном файле application-logging-test.properties внутри src/test/resources :

logging.level.com.foreach.testloglevel=TRACE
logging.level.root=ERROR

Если мы вызовем TestLogLevelController из наших тестов с описанными настройками, то мы теперь увидим TRACE - логи от нашего контроллера, а INFO - логов из других пакетов больше не будет:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

4. Настройка входа в систему

Если мы используем Logback , который используется по умолчанию в Spring Boot, мы можем установить уровень журнала в файле logback-test.xml в src/test/resources:

<configuration>
<include resource="/org/springframework/boot/logging/logback/base.xml"/>
<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>
<root level="error">
<appender-ref ref="STDOUT"/>
</root>
<logger name="com.foreach.testloglevel" level="debug"/>
</configuration>

В приведенном выше примере показано, как установить уровень журнала в нашей конфигурации Logback для тестов. Уровень журнала root установлен на INFO , а уровень журнала для нашего пакета com.foreach.testloglevel установлен на DEBUG .

Опять же, давайте проверим вывод после применения настроек сверху:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

4.1. Конфигурация журнала на основе профиля

Другой способ настроить профильную конфигурацию для наших тестов — установить свойство logging.config в application.properties для нашего профиля:

logging.config=classpath:logback-testloglevel.xml

Или, если мы хотим иметь единую конфигурацию Logback в нашем пути к классам, мы можем использовать элемент springProfile в logback.xml :

<configuration>
<include resource="/org/springframework/boot/logging/logback/base.xml"/>
<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>
<root level="error">
<appender-ref ref="STDOUT"/>
</root>
<springProfile name="logback-test1">
<logger name="com.foreach.testloglevel" level="info"/>
</springProfile>
<springProfile name="logback-test2">
<logger name="com.foreach.testloglevel" level="trace"/>
</springProfile>
</configuration>

Теперь, если мы вызовем TestLogLevelController в наших тестах с профилем logback-test1 , мы получим следующий вывод:

2019-04-01 14:08:27.545  INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

И наоборот, если мы изменим профиль на logback-test2 , вывод будет таким:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

5. Альтернатива Log4J

В качестве альтернативы, если мы используем Log4J2 , мы можем установить уровень журнала в файле log4j2-spring.xml в src/test/resources:

<Configuration>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>

<Loggers>
<Logger name="com.foreach.testloglevel" level="debug" />

<Root level="info">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>

Мы можем указать путь к нашей конфигурации Log4J , установив свойство logging.config в application.properties :

logging.config=classpath:log4j-testloglevel.xml

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

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController  : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

6. Заключение

В этой статье мы узнали, как установить уровень журнала при тестировании приложения Spring Boot . Затем мы изучили несколько различных способов его настройки.

Установка уровня журнала в application.properties Spring Boot — самый простой вариант, особенно когда мы используем аннотацию @SpringBootTest .

Как всегда, исходный код этих примеров закончился на GitHub .