Spring Boot Test ignoruje logging.level

91

Jeden z moich modułów Maven ignoruje moje poziomy logowania podczas uruchamiania testów.

W src/test/resourcesmam 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

Ja też próbowałem application-test.properties.

Moja aplikacja dużo rejestruje, szczególnie podczas ładowania kontekstu. Próbowałem logback.xml, logback-test.xmla logback-spring.xmljednak nic nie pomaga.

Mój 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>

Jedna prosta klasa testowa:

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

    @Autowired
    private JobLauncher jobLauncher;

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

}

Dzienniki aplikacji są w trybie DEBUG.

I tak, application.propertieszostanie załadowany. Próbowałem już zepsuć aplikację przez złą konfigurację.

Dziękuję za wszelkie podpowiedzi.

Michael Hegner
źródło

Odpowiedzi:

90

Dobra, co teraz zrobiłem, we wszystkich modułach skonfigurowałem w następujący sposób:

src / main / resources:
Używam konfiguracji logowania application.properiestak, logging.level.*jak opisano w pytaniu.

src / test / resources:
używam logback-test.xmltakich jak:

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

Ale nadal nie rozumiem, dlaczego w kilku modułach mógłbym użyć application.properties, aw innym to ignoruje ... Ale na razie działa u mnie tak, jak jest.

Ale może kilka wskazówek dotyczących podstawowej wiedzy jest nadal pożądanych.

Nie oznaczam mojej odpowiedzi jako rozwiązania, ponieważ nadal wydaje się, że jest to obejście.

Michael Hegner
źródło
7
Moje założenie jest takie, że application.propertiesjest analizowane później niż inicjalizacja testu. Dlatego org.springframework.testnie ma wpływu na początkowe logowanie testu.
Elnur Abdurrakhimov
ten sam problem, również przy użyciu logback-test.xml
radistao
3
To jest niesamowite. Dodałem <logger name="org.springframework.boot" level="warn" />i <logger name="org.eclipse.jetty" level="warn" />naprawdę zminimalizowałem hałas. Jeśli używasz swaggera, możesz również dodać <logger name="springfox" level="warn" />. Dobra robota. Miej nagrodę!
Bohemian
1
Pomogło to, chociaż zacząłem widzieć kilka dzienników z samego logowania po próbie dodania logback-test.xmlpliku. Aby je wyłączyć , podążyłem za główną odpowiedzią z tego postu StackOverflow - i BAM, udało mi się pozbyć całego wstępnego rejestrowania podczas uruchamiania testów.
Danny Bullis
1
Taki sam problem. 2 moduły o dokładnie takiej samej konfiguracji (klasa bazowa). Jeden ma logowanie podczas tworzenia kontekstu, a drugi nie. Zmiany w application.properties (logging.level) zaczynają obowiązywać. Korzystanie z powyższego logback-test.xmldziała zgodnie z oczekiwaniami. (+1) dzięki
Torsten
27
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />
    <logger name="org.springframework" level="INFO"/>
</configuration>

Jako szybką poprawkę umieściłem logback.xmlplik z powyższą zawartością src/test/resourcesi działa.

dnocode
źródło
3
Ładne, czyste rozwiązanie. Plik można również nazwać „logback-test.xml” i dla zachowania przejrzystości należy go umieścić w katalogu „src / test / resources”.
Krzysztof Tomaszewski
Tak, przejrzystość jest powodem, dla którego go nazwałemlogback-text.xml
Michael Hegner
jaka jest różnica w mojej odpowiedzi?
Michael Hegner,
22

Aby włączyć, application.propertiestrzeba dodać adnotację @SpringBootTestdo testowania zajęć, przeczytaj więcej tutaj .

ksandr
źródło
2
@SpringBootTest służy do testów integracyjnych i dlatego plik application.properties zostanie załadowany. Ale w przypadku testów jednostkowych nie jest to poprawna odpowiedź.
Tobsch
11

Szukam też rozwiązania tego problemu, tymczasem korzystam z następującego rozwiązania:

to nie jest najlepsze, ale działa

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

LoggingSystem: powszechna abstrakcja dotycząca systemów logowania.

->

get: Wykryj i zwróć używany system logowania. Obsługuje Logback i Java Logging

setLogLevel: Ustawia poziom rejestrowania dla danego rejestratora.

Pamiętaj, aby zmienić poziom dziennika wstecz dla wszystkich innych klas testowych.

Mam nadzieję, że ci to pomoże, powodzenia

Idan
źródło
2
To jedyny sposób, w jaki udało mi się zatrzymać rejestrowanie. Dziękuję
RobOhRob
Jest to typowy fragment kodu, który należy znać na wypadek, gdybyś musiał przetestować, co jest rejestrowane bez posiadania wielu plików konfiguracyjnych rejestratora.
Xenson
7

Jeśli twoje testy są opatrzone adnotacjami @DataJpaTest, możesz wyłączyć wylogowanie z Hibernate SQL za pomocą:

@DataJpaTest(showSql=false)
public class MyTest {
  ..
}
uı6ʎɹnɯ ꞁəıuɐp
źródło
Dzięki To zdecydowanie najlepsza odpowiedź. Dzięki za tonę.
Doogle
2

Spróbuj tego:

@ContextConfiguration(classes = ApplicationImportBackend.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles({ "test" })
public class BatchJobConfigurationTests {
    //...
}
luboskrnac
źródło
Dziękuję za odpowiedź, ale wyniki debugowania wciąż tam są. Może więcej kleju?
Michael Hegner,