Definindo o nível de log na inicialização do Spring ao testar
1. Visão geral
Neste tutorial, mostraremos comoset the log level when running tests for a Spring Boot application.
Embora possamos ignorar principalmente os logs enquanto nossos testes estão passando, escolher o nível de log correto pode ser crítico se houver necessidade dediagnose failed tests.
2. A Importância do Nível de Log
Configurar o nível do log corretamente pode economizar muito tempo.
Por exemplo, se os testes estiverem falhando em um servidor de CI, mas passando em nossa máquina de desenvolvimento,we won’t be able to diagnose the failing tests unless we have enough log output. Por outro lado, se registrarmos muitos detalhes, poderá ser mais difícil encontrar informações úteis.
Para obter a quantidade certa de detalhes, podemos ajustar os níveis de registro dos pacotes de nosso aplicativo. Se descobrirmos que um pacote Java é mais crítico para nossos testes, podemos atribuir a ele um nível inferior, comoDEBUG. Da mesma forma, para evitar muito ruído em nossos logs, podemos configurar um nível mais alto, digamosINFO ouERROR, para pacotes que são menos importantes.
Vamos explorar várias maneiras de definir o nível de registro.
3. Configurações de registro emapplication.properties
Se quisermosmodify the log level em nossos testes, há uma propriedade que podemos definir emsrc/test/resources/application.properties:
logging.level.com.example.testloglevel=DEBUG
Esta propriedade seráset thelog level specifically para o pacotecom.example.testloglevel.
Da mesma forma, podemos alterar o nível de registro para todos os pacotes emsetting the root log level:
logging.level.root=INFO
Agora, vamos experimentar nossas configurações de registro adicionando um endpoint REST que grava alguns registros:
@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...";
}
}
Como esperado, se chamarmos esse ponto de extremidade em nossos testes de, *, poderemos ver os logs deDEBUG * deTestLogLevelController:
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
Definir o nível de log dessa forma é muito fácil e, definitivamente, devemos fazer dessa forma se nossos testes estiverem anotados com@SpringBootTest. No entanto, se não usarmos essa anotação, teremos que configurar o nível de registro de uma maneira diferente.
3.1. Configurações de registro baseadas em perfil
Embora colocar as configurações emsrc/test/application.properties possa funcionar na maioria das situações, pode haver casos em que gostaríamos dehave different settings for one test or a group of tests.
Nesse caso,we can add a Spring profile to our test usando a anotaçãoActiveProfiles:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = TestLogLevelApplication.class)
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
@ActiveProfiles("logging-test")
public class TestLogLevelWithProfileIntegrationTest {
// ...
}
Nossas configurações de registro estarão em um arquivoapplication-logging-test.properties especial dentro desrc/test/resources:
logging.level.com.example.testloglevel=TRACE
logging.level.root=ERROR
Se chamarmosTestLogLevelController de nossos testes com as configurações descritas, veremos agora os slogsTRACE de nosso controlador e não haverá mais slogsINFO de outros pacotes:
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. Configurando Logback
Se usarmosLogback, que é usado por padrão no Spring Boot, podemosset the log level in the logback-test.xml file emsrc/test/resources:
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
O exemplo acima mostra como definir o nível de log em nossa configuração de Logback para testes. O nível de log raiz é definido comoINFO e o nível de log para nosso pacotecom.example.testloglevel é definido comoDEBUG.
Mais uma vez, vamos verificar a saída após aplicar as configurações acima:
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. Configuração de logback baseada em perfil
Outra maneira deset up a profile-specific configuration para nossos testes é definir alogging.config property emapplication.properties para nosso perfil:
logging.config=classpath:logback-testloglevel.xml
Ou ainda outro, digamos queif we want to have a single Logback configuration on our classpath, é usar a seleçãospringProfile emlogback.xml:
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
Agora, se chamarmosTestLogLevelController em nossos testes com o perfillogback-test1, obteremos a seguinte saída:
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
Por outro lado, se mudarmos o perfil paralogback-test2, a saída será:
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. Uma alternativa Log4J
Alternativamente, se usarmosLog4J2, podemosset the log level in the log4j2-spring.xml file dentro desrc/test/resources:
Podemos definir o caminho de nossa configuração deLog4J definindo alogging.config property emapplication.properties:
logging.config=classpath:log4j-testloglevel.xml
Finalmente, vamos verificar o resultado após aplicar as configurações acima:
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. Conclusão
Neste artigo, aprendemoshow to set the log level when testing a Spring Boot application. Exploramos várias maneiras diferentes de configurá-lo.
Definir o nível de registro noapplication.properties do Spring Boot se mostrou o mais fácil, especialmente quando estamos usando a anotação@SpringBootTest.
Como sempre, o código-fonte para esses exemplos acabou emGitHub.