Spring Boot Test忽略logging.level


90

我的maven模块之一在运行测试时会忽略我的日志记录级别。

src/test/resources我有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

我也试过了application-test.properties

我的应用程序记录很多,尤其是在加载上下文时。我想logback.xmllogback-test.xmllogback-spring.xml,但没有什么帮助。

我的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>

一个简单的测试类:

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

    @Autowired
    private JobLauncher jobLauncher;

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

}

应用程序日志处于调试模式。

是的,application.properties将加载。我已经尝试通过错误的配置破坏应用程序。

谢谢您的提示。

Answers:


89

好的,现在我在配置的所有模块中执行以下操作:

的src /主/资源:
我使用日志配置application.properieslogging.level.*如在问题说明。

src / test / resources:
我使用logback-test.xml像:

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

但是我仍然不明白,为什么在几个模块中我可以使用application.properties,但是在另一个模块中它却忽略了……但是现在它对我来说仍然有效。

但是,也许仍然很少有人会提供有关背景知识的提示。

我没有将我的答案标记为解决方案,因为它仍然感觉像是一种解决方法。


7
我的假设是,application.properties解析要晚于测试初始化​​。这就是为什么org.springframework.test对初始测试记录没有影响的原因。
Elnur Abdurrakhimov

同样的问题,也使用logback-test.xml
radistao 2016年

3
这太棒了。我说<logger name="org.springframework.boot" level="warn" /><logger name="org.eclipse.jetty" level="warn" />真正最小化噪声。如果您使用摇摇欲坠,也可以添加<logger name="springfox" level="warn" />。做得好。赏金吧!
波西米亚风格

1
这很有帮助,尽管在尝试添加logback-test.xml文件后,我开始从logback本身看到一堆日志。为了关闭这些功能,我遵循了StackOverflow帖子和BAM的主要回答,在运行测试时,我设法摆脱了所有先验日志。
丹尼·布利斯

1
同样的问题。2个具有完全相同的配置(基本类)的模块。一个在上下文创建期间记录日志,另一个则没有。application.properties(logging.level)中的更改生效。logback-test.xml按照预期使用上述方法。(+1)谢谢
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>

作为快速解决方案,我将logback.xml包含上述内容的文件放入文件中src/test/resources并且可以正常工作。


3
不错,干净的解决方案。该文件也可以命名为“ logback-test.xml”,并且为了清晰起见,应放在“ src / test / resources”下。
Krzysztof Tomaszewski

是的,清晰是我命名的原因logback-text.xml
Michael Hegner

我的答案有什么区别?
Michael Hegner

22

要启用application.properties需要向@SpringBootTest测试类添加注释的信息,请在此处阅读更多内容。


2
@SpringBootTest用于集成测试,因此将加载application.properties。但是对于单元测试,这不是正确的答案。
Tobsch

11

我也在寻找一种解决方案,与此同时,我正在使用以下解决方案:

这不是最好的,但是有效

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

LoggingSystem:日志系统上的通用抽象。

->

get:检测并返回正在使用的日志系统。支持Logback和Java日志记录

setLogLevel:设置给定记录器的记录级别。

确保更改所有其他测试类的后备日志级别。

希望它对您有帮助,祝您好运


2
这是我停止记录的唯一方法。谢谢
RobOhRob

这是通常需要知道的代码,以防万一您必须测试正在记录的内容而又没有大量的记录器配置文件。
Xenson

7

如果您的测试带有注释,则@DataJpaTest可以使用以下方法关闭Hibernate SQL登录:

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

谢谢这是迄今为止最好的答案。万分感谢。
Doogle

2

试试这个:

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

感谢您的答复,但是调试输出仍然存在。可能还有胶水吗?
Michael Hegner
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.