Der Spring Boot Test ignoriert die Protokollierungsstufe

87

Eines meiner Maven-Module ignoriert meine Protokollierungsstufen beim Ausführen von Tests.

In habe src/test/resourcesich application.properties:

app.name=bbsng-import-backend
app.description=Import Backend Module for Application
spring.profiles.active=test

# LOGGING
logging.level.root=error
logging.level.org.springframework.core =fatal
logging.level.org.springframework.beans=fatal
logging.level.org.springframework.context=fatal
logging.level.org.springframework.transaction=error
logging.level.org.springframework.test=error
logging.level.org.springframework.web=error
logging.level.org.hibernate=ERROR

Ich habe es auch versucht application-test.properties.

Meine Anwendung protokolliert viel, insbesondere beim Laden des Kontexts. Ich habe versucht logback.xml, logback-test.xmlund logback-spring.xmldoch nichts hilft.

Mein Pom:

<parent>
    <groupId>at.company.bbsng</groupId>
    <artifactId>bbsng-import</artifactId>
    <version>0.1.0-SNAPSHOT</version>
</parent>

<artifactId>bbsng-import-backend</artifactId>
<name>bbsng-import-backend</name>

<properties>
    <start-class>at.company.bbsng.dataimport.ApplicationImportBackend</start-class>
</properties>


<dependencies>

    <!-- APPLICATION ... -->
    <dependency>
        <groupId>at.company.bbsng</groupId>
        <artifactId>bbsng-app-domain</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- SPRING ... -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- JAVAX ... -->
       ...

    <!-- COMMONS ... -->
       ...

    <!-- LOMBOK ... -->
       ...

    <!-- DB -->
       ...

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${org.springframework.boot-version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Eine einfache Testklasse:

@ContextConfiguration(classes = { ApplicationImportBackend.class })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {

    @Autowired
    private JobLauncher jobLauncher;

    @Test
    public void testSimpleProperties() throws Exception {
        assertNotNull(jobLauncher);
    }

}

Anwendungsprotokolle befinden sich im DEBUG-Modus.

Und ja, das application.propertieswird geladen. Ich habe bereits versucht, die Anwendung durch falsche Konfiguration zu brechen.

Vielen Dank für Hinweise.

Michael Hegner
quelle

Antworten:

86

Okay, was ich jetzt gemacht habe, in allen Modulen habe ich wie folgt konfiguriert:

src / main / resources:
Ich verwende die Protokollierungskonfiguration application.properieswie logging.level.*in der Frage beschrieben.

src / test / resources:
Ich benutze logback-test.xmlwie:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="*.myapp" level="error" />
    <logger name="org.springframework.core " level="error" />
    <logger name="org.springframework.beans" level="error" />
    <logger name="org.springframework.context" level="error" />
    <logger name="org.springframework.transaction" level="error" />
    <logger name="org.springframework.web" level="error" />
    <logger name="org.springframework.test" level="error" />
    <logger name="org.hibernate" level="error" />
</configuration>

Aber ich verstehe immer noch nicht, warum ich in wenigen Modulen application.properties verwenden könnte, aber in einem anderen Modul ignoriert es ... Aber im Moment funktioniert es für mich so wie es ist.

Aber vielleicht sind einige Hinweise mit Hintergrundwissen noch willkommen.

Ich markiere meine Antwort nicht als Lösung, da sie sich immer noch wie eine Problemumgehung anfühlt.

Michael Hegner
quelle
7
Ich gehe davon aus, dass application.propertiesdie Analyse später als die Testinitialisierung erfolgt. Aus diesem Grund org.springframework.testhat dies keine Auswirkungen auf die anfängliche Testprotokollierung.
Elnur Abdurrakhimov
das gleiche Problem, auch mit logback-test.xml
radistao
3
Das ist fantastisch. Ich fügte hinzu <logger name="org.springframework.boot" level="warn" />und <logger name="org.eclipse.jetty" level="warn" />um den Lärm wirklich zu minimieren. Wenn Sie Swagger verwenden, können Sie auch hinzufügen <logger name="springfox" level="warn" />. Gut gemacht. Hab ein Kopfgeld!
Böhmisch
1
Dies hat geholfen, obwohl ich nach dem Versuch, die logback-test.xmlDatei hinzuzufügen, einige Protokolle von Logback selbst gesehen habe . Um diese auszuschalten, folgte ich der Hauptantwort aus diesem StackOverflow-Beitrag - und BAM, ich habe es geschafft, alle vorläufigen Protokolle beim Ausführen von Tests loszuwerden.
Danny Bullis
1
Gleiches Problem. 2 Module mit genau der gleichen Konfiguration (Basisklasse). Einer hat die Protokollierung während der Kontexterstellung, der andere nicht. Änderungen in application.properties (logging.level) werden wirksam. Die Verwendung von oben logback-test.xmlfunktioniert wie erwartet. (+1) danke
Torsten
26
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="INFO"/>
</configuration>

Als schnelle Lösung habe ich eine logback.xmlDatei mit dem oben genannten Inhalt eingefügt src/test/resourcesund es funktioniert.

dnocode
quelle
3
Schöne, saubere Lösung. Die Datei kann auch als "logback-test.xml" bezeichnet werden und sollte aus Gründen der Übersichtlichkeit unter "src / test / resources" abgelegt werden.
Krzysztof Tomaszewski
Ja, Klarheit ist der Grund, warum ich es genannt habelogback-text.xml
Michael Hegner
Was ist der Unterschied zu meiner Antwort?
Michael Hegner
22

So aktivieren Sie application.propertiesmüssen eine Anmerkung hinzufügen @SpringBootTestzu Testklasse, lesen Sie mehr hier .

ksandr
quelle
2
@SpringBootTest ist für Integrationstests vorgesehen und daher werden die application.properties geladen. Für Unit-Tests ist dies jedoch nicht die richtige Antwort.
Tobsch
11

Ich suche auch nach einer Lösung dafür, während ich die folgende Lösung verwende:

Das ist nicht das Beste, aber es funktioniert

@BeforeClass
public static void setErrorLogging() {
   LoggingSystem.get(ClassLoader.getSystemClassLoader()).setLogLevel(Logger.ROOT_LOGGER_NAME, LogLevel.ERROR);
}

LoggingSystem: eine gemeinsame Abstraktion über Protokollierungssysteme.

->

get: Erkennen Sie das verwendete Protokollierungssystem und geben Sie es zurück. Unterstützt Logback und Java Logging

setLogLevel: Legt die Protokollierungsstufe für einen bestimmten Protokollierer fest.

Stellen Sie sicher, dass Sie die Back-Log-Ebene für alle anderen Testklassen ändern.

Hoffe es hilft dir, viel Glück

Idan
quelle
2
Nur so konnte ich die Protokollierung stoppen. Vielen Dank
RobOhRob
Dies ist ein üblicher Code, den Sie kennen müssen, wenn Sie testen müssen, was protokolliert wird, ohne eine Reihe von Logger-Konfigurationsdateien zu haben.
Xenson
6

Wenn Ihre Tests mit Anmerkungen versehen sind @DataJpaTest, können Sie die Hibernate SQL-Abmeldung deaktivieren mit:

@DataJpaTest(showSql=false)
public class MyTest {
  ..
}
uı6ʎɹnɯ ꞁəıuɐp
quelle
2

Versuche dies:

@ContextConfiguration(classes = ApplicationImportBackend.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {
    //...
}
luboskrnac
quelle
Vielen Dank für die Antwort, aber Debug-Ausgabe noch da. Vielleicht noch mehr Kleber?
Michael Hegner