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.

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.


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.


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 .


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


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 {
  ..
}

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 {
    //...
}

Dziękuję za odpowiedź, ale wyniki debugowania wciąż tam są. Może więcej kleju?
— Michael Hegner,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.