Het logniveau instellen in Spring Boot tijdens testen

1. Overzicht

In deze zelfstudie laten we zien hoe u dat kunt doen stel het logniveau in bij het uitvoeren van tests voor een Spring Boot-applicatie.

Hoewel we de logboeken meestal kunnen negeren terwijl onze tests slagen, kan het kiezen van het juiste logniveau van cruciaal belang zijn als dat nodig is diagnosticeer mislukte tests.

2. Het belang van het logniveau

Het correct configureren van het logniveau kan ons veel tijd besparen.

Als tests bijvoorbeeld mislukken op een CI-server maar doorgeven aan onze ontwikkelmachine, we kunnen de falende tests niet diagnosticeren, tenzij we voldoende logboekuitvoer hebben. Aan de andere kant, als we te veel details loggen, kan het moeilijker zijn om bruikbare informatie te vinden.

Om de juiste hoeveelheid details te bereiken, kunnen we de logboekregistratieniveaus van de pakketten van onze applicatie verfijnen. Als we ontdekken dat een Java-pakket kritischer is voor onze tests, kunnen we het een lager niveau geven, zoals DEBUG. Evenzo, om te voorkomen dat er te veel ruis in onze logboeken zit, kunnen we bijvoorbeeld een hoger niveau configureren INFO of FOUT, voor pakketten die minder belangrijk zijn.

Laten we verschillende manieren onderzoeken om het logboekregistratieniveau in te stellen.

3. Aanmeldingsinstellingen in application.properties

Als we willen wijzig het logniveau in onze tests is er een eigenschap die we kunnen instellen src / test / resources /application.properties:

logging.level.com.baeldung.testloglevel = DEBUG

Deze eigenschap zal stel delog-niveau specifiek voor de com.baeldung.testloglevel pakket.

Evenzo kunnen we het logboekregistratieniveau voor alle pakketten wijzigen door het instellen van het root log-niveau:

logging.level.root = INFO

Laten we nu onze logboekinstellingen uitproberen door een REST-eindpunt toe te voegen dat enkele logboeken schrijft:

@RestController openbare klasse TestLogLevelController {privé statische laatste Logger LOG = LoggerFactory.getLogger (TestLogLevelController.class); @Autowired privé OtherComponent otherComponent; @GetMapping ("/ testLogLevel") public String testLogLevel () {LOG.trace ("Dit is een TRACE-log"); LOG.debug ("Dit is een DEBUG-log"); LOG.info ("Dit is een INFO-log"); LOG.error ("Dit is een FOUTENlogboek"); otherComponent.processData (); return "Toegevoegd wat log output aan console ..."; }}

Zoals verwacht, als we dit eindpunt noemen in onze tests, we zullen in staat zijn om de DEBUG logboeken van TestLogLevelController:

2019-04-01 14: 08: 27.545 DEBUG 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een DEBUG-log 2019-04-01 14: 08: 27.545 INFO 56585 --- [ nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een INFO-log 2019-04-01 14: 08: 27.546 FOUT 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een FOUTENlogboek 2019-04-01 14: 08: 27.546 INFO 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een INFO-logboek van een ander pakket 2019-04-01 14: 08: 27.546 FOUT 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een FOUTENlogboek van een ander pakket 

Het log-niveau op deze manier instellen is vrij eenvoudig, en we zouden het zeker op deze manier moeten doen als onze tests zijn geannoteerd met @BuienRadarNL. Als we die annotatie echter niet gebruiken, moeten we het logniveau op een andere manier configureren.

3.1. Profielgebaseerde logboekinstellingen

Hoewel de instellingen in src / test / application.properties zou het in de meeste situaties werken, er kunnen gevallen zijn waarin we zouden willen verschillende instellingen hebben voor één test of een groep tests.

In dat geval, we kunnen een Spring-profiel aan onze test toevoegen door de ActiveProfiles annotatie:

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

Onze logboekinstellingen staan ​​dan in een speciale application-logging-test.properties bestand binnen src / test / resources:

logging.level.com.baeldung.testloglevel = TRACE logging.level.root = FOUT

Als we bellen TestLogLevelController van onze tests met de beschreven instellingen, zullen we nu het SPOOR logs van onze controller, en er zullen er geen meer zijn INFO logboeken van andere pakketten:

2019-04-01 14: 08: 27.545 DEBUG 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een DEBUG-log 2019-04-01 14: 08: 27.545 INFO 56585 --- [ nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een INFO-log 2019-04-01 14: 08: 27.546 ERROR 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een FOUTENlogboek 2019-04-01 14: 08: 27.546 ERROR 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een FOUTENlogboek van een ander pakket

4. Logback configureren

Als we Logback gebruiken, dat standaard wordt gebruikt in Spring Boot, kunnen we dat stel het logniveau in het logback-test.xml het dossier binnen src / test / resources:

    % d {HH: mm: ss.SSS} [% thread]% -5level% logger {36} -% msg% n 

Het bovenstaande voorbeeld laat zien hoe u het logniveau instelt in onze Logback-configuratie voor tests. Het rootlog-niveau is ingesteld op INFO en het logniveau voor onze com.baeldung.testloglevel pakket is ingesteld op DEBUG.

Nogmaals, laten we de uitvoer controleren nadat we de bovenstaande instellingen hebben toegepast:

2019-04-01 14: 08: 27.545 DEBUG 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een DEBUG-log 2019-04-01 14: 08: 27.545 INFO 56585 --- [ nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een INFO-log 2019-04-01 14: 08: 27.546 ERROR 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een FOUTENlogboek 2019-04-01 14: 08: 27.546 INFO 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een INFO-logboek van een ander pakket 2019-04-01 14: 08: 27.546 FOUT 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een FOUTENlogboek van een ander pakket 

4.1. Profielgebaseerde logback-configuratie

Een andere manier om een profielspecifieke configuratie instellen voor onze tests is het instellen van de logging.config eigendom in application.properties voor ons profiel:

logging.config = classpath: logback-testloglevel.xml

Of, nog een ander, zeg maar als we een enkele Logback-configuratie op ons klassenpad willen hebben, is om de springProfile element in logback.xml:

    % d {HH: mm: ss.SSS} [% thread]% -5level% logger {36} -% msg% n 

Nu, als we de TestLogLevelController in onze tests met het profiel logback-test1, krijgen we de volgende output:

2019-04-01 14: 08: 27.545 INFO 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een INFO-log 2019-04-01 14: 08: 27.546 FOUT 56585 --- [ nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een FOUTENlogboek 2019-04-01 14: 08: 27.546 INFO 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een INFO-logboek van een ander pakket 2019-04-01 14: 08: 27.546 ERROR 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een FOUTENlogboek van een ander pakket 

Aan de andere kant, als we het profiel wijzigen in logback-test2, de output zal zijn:

2019-04-01 14: 08: 27.545 DEBUG 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een DEBUG-log 2019-04-01 14: 08: 27.545 INFO 56585 --- [ nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een INFO-log 2019-04-01 14: 08: 27.546 ERROR 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een FOUTENlogboek 2019-04-01 14: 08: 27.546 INFO 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een INFO-logboek van een ander pakket 2019-04-01 14: 08: 27.546 FOUT 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een FOUTENlogboek van een ander pakket 

5. Een Log4J-alternatief

Als alternatief, als we Log4J2 gebruiken, kunnen we dat stel het logniveau in het log4j2-spring.xml het dossier binnen src / test / resources:

We kunnen het pad van ons bepalen Log4J configuratie door de logging.config eigendom in application.properties:

logging.config = classpath: log4j-testloglevel.xml

Laten we tot slot de uitvoer controleren na het toepassen van de bovenstaande instellingen:

2019-04-01 14: 08: 27.545 DEBUG 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een DEBUG-log 2019-04-01 14: 08: 27.545 INFO 56585 --- [ nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een INFO-log 2019-04-01 14: 08: 27.546 ERROR 56585 --- [nio-8080-exec-1] cbtestloglevel.TestLogLevelController: Dit is een FOUTENlogboek 2019-04-01 14: 08: 27.546 INFO 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een INFO-logboek van een ander pakket 2019-04-01 14: 08: 27.546 FOUT 56585 --- [nio-8080-exec-1] cbcomponent.OtherComponent: Dit is een FOUTENlogboek van een ander pakket 

6. Conclusie

In dit artikel hebben we geleerd hoe u het logniveau instelt bij het testen van een Spring Boot-applicatie. We hebben een aantal verschillende manieren onderzocht om het te configureren.

Het logniveau instellen in Spring Boot's application.properties toonde zichzelf als de gemakkelijkste, vooral wanneer we de @BuienRadarNL annotatie.

Zoals altijd staat de broncode voor deze voorbeelden op GitHub.