Spring Boot Test ignora logging.level


94

Uno dei miei moduli maven ignora i miei livelli di registrazione durante l'esecuzione dei test.

In src/test/resourcesho 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

Ho anche provato application-test.properties.

La mia applicazione registra molto, soprattutto durante il caricamento del contesto. Ho provato logback.xml, logback-test.xmle logback-spring.xmlma niente aiuta.

Il mio 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>

Una semplice lezione di prova:

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

    @Autowired
    private JobLauncher jobLauncher;

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

}

I registri dell'applicazione sono in modalità DEBUG.

E sì, application.propertiesverrà caricato. Ho già provato a rompere l'applicazione con una configurazione sbagliata.

Grazie per eventuali suggerimenti.

Risposte:


94

Va bene quello che ho fatto ora, in tutti i moduli ho configurato come segue:

src / main / resources:
utilizzo la configurazione del log in application.properiescome logging.level.*descritto nella domanda.

src / test / resources:
io uso logback-test.xmlcome:

<?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>

Ma ancora non capisco, perché in pochi moduli potrei usare application.properties, ma in un altro modulo ignora ... Ma per ora per me funziona così com'è.

Ma forse pochi suggerimenti con conoscenze di base sono ancora ben accetti.

Non contrassegno la mia risposta come soluzione, perché sembra ancora una soluzione alternativa.


7
La mia ipotesi è che application.propertiesvenga analizzata dopo l'inizializzazione del test. Ecco perché org.springframework.testnon ha alcun effetto sulla registrazione del test iniziale.
Elnur Abdurrakhimov

3
Questo e spettacolare. Ho aggiunto <logger name="org.springframework.boot" level="warn" />e <logger name="org.eclipse.jetty" level="warn" />per ridurre al minimo il rumore. Se stai usando spavalderia, puoi anche aggiungere <logger name="springfox" level="warn" />. Molto bene. Abbi una taglia!
Bohemian

1
Ciò ha aiutato, anche se ho iniziato a vedere un mucchio di log dal logback stesso dopo aver provato ad aggiungere il logback-test.xmlfile. Per disattivarli, ho seguito la risposta principale di questo post StackOverflow e BAM, sono riuscito a sbarazzarmi di tutte le registrazioni precursori durante l'esecuzione dei test.
Danny Bullis

1
Il mio logback-test.xmlfile era così semplice: <? Xml version = "1.0" encoding = "UTF-8"?> <configuration> <statusListener class = "ch.qos.logback.core.status.NopStatusListener" /> <include resource = "org / springframework / boot / logging / logback / base.xml" /> <logger name = "org.springframework" level = "error" /> </configuration>
Danny Bullis

1
Stesso problema. 2 moduli con esattamente la stessa configurazione (classe base). Uno ha la registrazione durante la creazione del contesto, l'altro no. Le modifiche in application.properties (logging.level) hanno effetto. L'utilizzo di cui sopra logback-test.xmlfunziona come previsto. (+1) grazie
Torsten

28
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="INFO"/>
</configuration>

Come soluzione rapida, inserisco il logback.xmlfile con il contenuto di cui sopra src/test/resourcese funziona.


3
Soluzione bella e pulita. Il file può anche essere denominato "logback-test.xml" e dovrebbe essere posizionato in "src / test / resources" per maggiore chiarezza.
Krzysztof Tomaszewski

Sì, la chiarezza è il motivo per cui l'ho chiamatologback-text.xml
Michael Hegner

qual è la differenza con la mia risposta?
Michael Hegner

22

Per abilitare la application.propertiesnecessità di aggiungere un'annotazione @SpringBootTestalla classe di test, leggi di più qui .


2
@SpringBootTest è per i test di integrazione e quindi verrà caricato application.properties. Ma per i test unitari questa non è la risposta corretta.
Tobsch

12

Sto anche cercando una soluzione, nel frattempo sto usando la seguente soluzione:

questo non è il massimo ma funziona

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

LoggingSystem: un'astrazione comune sui sistemi di registrazione.

->

get: Rileva e restituisce il sistema di registrazione in uso. Supporta Logback e Java Logging

setLogLevel: Imposta il livello di registrazione per un dato logger.

Assicurati di cambiare il livello di registro per tutte le altre classi di test.

Spero ti aiuti, buona fortuna


3
Questo è l'unico modo in cui riesco a fermare la registrazione. Grazie
RobOhRob

Questo è un solito pezzo di codice da sapere nel caso in cui devi testare cosa viene registrato senza avere un mucchio di file di configurazione del logger.
Xenson

Questo ha funzionato come un fascino. Voglio solo sottolineare da usare @BeforeAllse si utilizza JUnit5
batero

7

Se i tuoi test sono annotati con @DataJpaTestpuoi disattivare la disconnessione di Hibernate SQL con:

@DataJpaTest(showSql=false)
public class MyTest {
  ..
}

Grazie Questa è di gran lunga la migliore risposta. Grazie mille.
Doogle

2

Prova questo:

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

Grazie per la risposta, ma l'output di debug è ancora presente. Forse altra colla?
Michael Hegner
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.