Impostazione del livello di registro in Spring Boot durante il test

1. Panoramica

In questo tutorial, mostreremo come impostare il livello di log durante l'esecuzione di test per un'applicazione Spring Boot .

Sebbene possiamo per lo più ignorare i log durante il superamento dei nostri test, la scelta del livello di log corretto può essere fondamentale se è necessario diagnosticare i test falliti .

2. L'importanza del livello di registro

Configurare correttamente il livello di log può farci risparmiare molto tempo.

Ad esempio, se i test non riescono su un server CI ma passano sulla nostra macchina di sviluppo, non saremo in grado di diagnosticare i test falliti a meno che non abbiamo abbastanza output di log . D'altra parte, se registriamo troppi dettagli, potrebbe essere più difficile trovare informazioni utili.

Per ottenere la giusta quantità di dettagli, possiamo mettere a punto i livelli di registrazione dei pacchetti della nostra applicazione. Se troviamo che un pacchetto Java è più critico per i nostri test, possiamo assegnargli un livello inferiore, come DEBUG . Allo stesso modo, per evitare di avere troppo rumore nei nostri log, possiamo configurare un livello più alto, diciamo INFO o ERRORE, per i pacchetti meno importanti.

Esploriamo vari modi per impostare il livello di registrazione.

3. Impostazioni di registrazione in application.properties

Se vogliamo modificare il livello di log nei nostri test, c'è una proprietà che possiamo impostare in src / test / resources / application.properties :

logging.level.com.baeldung.testloglevel=DEBUG

Questa proprietà imposterà il livello di log specificatamente per il pacchetto com.baeldung.testloglevel .

Allo stesso modo, possiamo modificare il livello di registrazione per tutti i pacchetti impostando il livello di registro di root :

logging.level.root=INFO

Ora, proviamo le nostre impostazioni di registrazione aggiungendo un endpoint REST che scrive alcuni log:

@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..."; } }

Come previsto, se chiamiamo questo endpoint nei nostri test , saremo in grado di vedere i registri DEBUG da 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 

Impostare il livello di log in questo modo è abbastanza semplice e dovremmo assolutamente farlo in questo modo se i nostri test sono annotati con @SpringBootTest . Tuttavia, se non usiamo quell'annotazione, dovremo configurare il livello di log in un modo diverso.

3.1. Impostazioni di registrazione basate sul profilo

Anche se mettere le impostazioni in src / test / application.properties funzionerebbe nella maggior parte delle situazioni, potrebbero esserci casi in cui vorremmo avere impostazioni diverse per un test o un gruppo di test .

In tal caso, possiamo aggiungere un profilo Spring al nostro test utilizzando l' annotazione ActiveProfiles :

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

Le nostre impostazioni di registrazione saranno quindi in uno speciale file application-logging-test.properties all'interno di src / test / resources :

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

Se chiamiamo TestLogLevelController dai nostri test con le impostazioni descritte, ora vedremo i log TRACE dal nostro controller e non ci saranno più log INFO da altri pacchetti:

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. Configurazione del logback

Se utilizziamo Logback, che viene utilizzato per impostazione predefinita in Spring Boot, possiamo impostare il livello di log nel file logback-test.xml all'interno di src / test / resources:

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

L'esempio sopra mostra come impostare il livello di log nella nostra configurazione Logback per i test. Il livello di log root è impostato su INFO e il livello di log per il nostro pacchetto com.baeldung.testloglevel è impostato su DEBUG .

Ancora una volta, controlliamo l'output dopo aver applicato le impostazioni dall'alto:

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. Configurazione del logback basata sul profilo

Un altro modo per impostare una configurazione specifica del profilo per i nostri test è impostare la proprietà logging.config in application.properties per il nostro profilo:

logging.config=classpath:logback-testloglevel.xml

O, ancora un altro, dire che se vogliamo avere una singola configurazione Logback sul nostro percorso di classe, è quello di utilizzare lo springProfile elemento in logback.xml :

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

Ora, se chiamiamo TestLogLevelController nei nostri test con il profilo logback-test1 , otterremo il seguente output:

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 

D'altra parte, se cambiamo il profilo in logback-test2 , l'output sarà:

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. Un'alternativa a Log4J

In alternativa, se usiamo Log4J2, possiamo impostare il livello di log nel file log4j2-spring.xml all'interno di src / test / resources:

Siamo in grado di impostare il percorso della nostra Log4J configurazione impostando il logging.config immobile in application.properties :

logging.config=classpath:log4j-testloglevel.xml

Infine, controlliamo l'output dopo aver applicato le impostazioni di cui sopra:

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. Conclusione

In questo articolo abbiamo imparato come impostare il livello di registro durante il test di un'applicazione Spring Boot . Abbiamo esplorato diversi modi per configurarlo.

L'impostazione del livello di log in application.properties di Spring Boot si è rivelata la più semplice, soprattutto quando si utilizza l' annotazione @SpringBootTest .

Come sempre, il codice sorgente di questi esempi è finito su GitHub.