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 .