Festlegen der Protokollstufe im Spring Boot beim Testen

1. Übersicht

In diesem Lernprogramm wird gezeigt, wie Sie die Protokollstufe festlegen, wenn Sie Tests für eine Spring Boot-Anwendung ausführen .

Obwohl wir die Protokolle während des Bestehens unserer Tests meistens ignorieren können, kann die Auswahl der richtigen Protokollstufe von entscheidender Bedeutung sein, wenn fehlgeschlagene Tests diagnostiziert werden müssen .

2. Die Bedeutung der Protokollebene

Durch die korrekte Konfiguration der Protokollebene können wir viel Zeit sparen.

Wenn beispielsweise Tests auf einem CI-Server fehlschlagen, aber unseren Entwicklungscomputer weiterleiten, können wir die fehlgeschlagenen Tests nur diagnostizieren, wenn genügend Protokollausgabe vorhanden ist . Wenn wir jedoch zu viele Details protokollieren, ist es möglicherweise schwieriger, nützliche Informationen zu finden.

Um die richtige Detailgenauigkeit zu erzielen, können wir die Protokollierungsstufen der Pakete unserer Anwendung optimieren. Wenn wir feststellen, dass ein Java-Paket für unsere Tests kritischer ist, können wir ihm eine niedrigere Ebene geben, wie z . B. DEBUG . Um zu viel Rauschen in unseren Protokollen zu vermeiden, können wir für Pakete, die weniger wichtig sind, eine höhere Ebene konfigurieren, z. B. INFO oder ERROR .

Lassen Sie uns verschiedene Möglichkeiten zum Festlegen der Protokollierungsstufe untersuchen.

3. Protokollierungseinstellungen in application.properties

Wenn wir die Protokollstufe in unseren Tests ändern möchten, können wir eine Eigenschaft in src / test / resources / application.properties festlegen :

logging.level.com.baeldung.testloglevel=DEBUG

Diese Eigenschaft legt die Protokollebene speziell für das Paket com.baeldung.testloglevel fest .

Ebenso können wir die Protokollierungsstufe für alle Pakete ändern, indem wir die Stammprotokollstufe festlegen :

logging.level.root=INFO

Probieren Sie nun unsere Protokollierungseinstellungen aus, indem Sie einen REST-Endpunkt hinzufügen, der einige Protokolle schreibt:

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

Wenn wir diesen Endpunkt in unseren Tests aufrufen , können wir erwartungsgemäß die DEBUG- Protokolle von TestLogLevelController anzeigen :

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 

Das Einstellen der Protokollstufe auf diese Weise ist recht einfach, und wir sollten dies auf jeden Fall so tun, wenn unsere Tests mit @SpringBootTest kommentiert sind . Wenn wir diese Anmerkung jedoch nicht verwenden, müssen wir die Protokollebene auf andere Weise konfigurieren.

3.1. Profilbasierte Protokollierungseinstellungen

Obwohl das Einfügen der Einstellungen in src / test / application.properties in den meisten Situationen funktionieren würde, kann es Fälle geben, in denen wir unterschiedliche Einstellungen für einen Test oder eine Gruppe von Tests wünschen .

In diesem Fall können wir unserem Test mithilfe der ActiveProfiles- Annotation ein Spring-Profil hinzufügen :

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

Unsere Protokollierungseinstellungen befinden sich dann in einer speziellen Datei application-logging-test.properties in src / test / resources :

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

Wenn wir TestLogLevelController aus unseren Tests mit den beschriebenen Einstellungen aufrufen , werden jetzt die TRACE- Protokolle von unserem Controller angezeigt , und es werden keine INFO- Protokolle von anderen Paketen mehr angezeigt :

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 konfigurieren

Wenn wir Logback verwenden, das standardmäßig in Spring Boot verwendet wird, können wir die Protokollstufe in der Datei logback-test.xml in src / test / resources festlegen :

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

Das obige Beispiel zeigt, wie Sie die Protokollstufe in unserer Logback-Konfiguration für Tests festlegen. Die Root-Protokollstufe ist auf INFO und die Protokollstufe für unser Paket com.baeldung.testloglevel auf DEBUG festgelegt .

Lassen Sie uns die Ausgabe erneut überprüfen, nachdem Sie die Einstellungen von oben angewendet haben:

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. Profile-based Logback Configuration

Another way to set up a profile-specific configuration for our tests is to set the logging.config property in application.properties for our profile:

logging.config=classpath:logback-testloglevel.xml

Or, yet another, say if we want to have a single Logback configuration on our classpath, is to use the springProfile element in logback.xml:

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

Now, if we call the TestLogLevelController in our tests with the profile logback-test1, we will get the following 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 

On the other hand, If we change the profile to logback-test2, the output will be:

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. A Log4J Alternative

Alternatively, if we use Log4J2, we can set the log level in the log4j2-spring.xml file within src/test/resources:

We can set the path of our Log4J configuration by setting the logging.config property in application.properties:

logging.config=classpath:log4j-testloglevel.xml

Finally, let's check the output after applying the above settings:

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

In this article, we've learned how to set the log level when testing a Spring Boot application. We explored a number of different ways of configuring it.

Setting the log level in Spring Boot's application.properties showed itself as the easiest, especially when we are using the @SpringBootTest annotation.

Wie immer ist der Quellcode für diese Beispiele auf GitHub beendet.