【问题标题】:How to set Spring logging level while testing? [duplicate]如何在测试时设置 Spring 日志记录级别? [复制]
【发布时间】:2017-10-29 10:52:27
【问题描述】:

我的 Spring Boot 测试堆栈是 Maven + Surefire + JUnit4。我正在使用 @RunWith(SpringJUnit4ClassRunner.class) 注释测试。

我的项目根目录中有application.properties,这行:

logging.level.root=INFO

这控制运行 Spring boot 应用程序时的日志记录,并且可以正常运行。

但是,每当我运行任何 JUnit4 测试时,我都会收到如下所示的 DEBUG 输出页面的垃圾邮件:

....
17:43:20.500 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'autoConfigurationReport'
17:43:20.500 [main] DEBUG org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader - Registered bean definition for imported class 'org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperConfiguration'
17:43:20.501 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.boot.autoconfigure.condition.BeanTypeRegistry'
17:43:20.502 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'autoConfigurationReport'
....

所有这些垃圾邮件使我们几乎不可能看到真正相关的部分。如何将日志记录级别应用于测试输出?

我没有明确设置任何日志记录,根据文档,默认使用 Logback。

【问题讨论】:

  • 您在/test/resources 中有application.properties 吗?您还可以在使用-Dspring.foo.bar=baz 执行测试时传递任意属性。
  • @jonrsharpe 我只是尝试将我的 application.properties 复制到那里,但没有任何改变。

标签: java spring maven logging logback


【解决方案1】:

从一般角度来看,您可以在测试资源级别提供单独的logback-test.xml-文件。在此文件中,您可以添加有关针对您想要的输出的日志级别的设置,例如:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
    </layout>
  </appender>

  <logger name="com.your.package" level="DEBUG">
    <appender-ref ref="CONSOLE"/>
  </logger>

  <logger name="org.springframework" level="WARN">
    <appender-ref ref="CONSOLE"/>
  </logger>

  <logger name="org.hibernate" level="WARN">
    <appender-ref ref="CONSOLE"/>
  </logger>

  <logger name="org.eclipse" level="WARN">
    <appender-ref ref="CONSOLE"/>
  </logger>

  <logger name="jndi" level="WARN">
    <appender-ref ref="CONSOLE"/>
  </logger>

  <logger name="org.apache.http.wire" level="WARN">
      <appender-ref ref="CONSOLE"/>
  </logger>

  <root level="DEBUG">
      <appender-ref ref="CONSOLE"/>
  </root>

</configuration>

希望这对您减少日志输出有所帮助。更多内容记录在 logback 自己的页面:

https://logback.qos.ch/manual/configuration.html

上面有提到:

让我们从讨论 logback 尝试配置自身的初始化步骤开始: 1.Logback 尝试在类路径中查找名为 logback-test.xml 的文件。

2.如果没有找到这样的文件,logback 会尝试在类路径中找到一个名为 logback.groovy 的文件。

3.如果没有找到这样的文件,它会检查类路径中的文件logback.xml..

4.如果没有找到这样的文件,则使用服务提供者加载工具(JDK 1.6 中引入)通过查找文件 META-INF 来解析 com.qos.logback.classic.spi.Configurator 接口的实现\services\ch.qos.logback.classic.spi.Configurator 在类路径中。其内容应指定所需配置器实现的完全限定类名。

5.如果以上都没有成功,logback 会使用 BasicConfigurator 自动配置自己,这将导致日志输出被定向到控制台。

【讨论】:

  • 这很有帮助。现在,我只收到一页关于设置记录器级别的 Logback 输出的垃圾邮件。看起来在设置 Logback 之前还使用了其他一些记录器。
  • 如果没有附加程序定义和引用,它实际上可以完美运行!通过在这里尝试 Michael Hegner 的答案发现了这一点:stackoverflow.com/a/35254610/2445864
  • 不错!在我们的一个应用程序中也删除了我的引用,它似乎删除了所有开销无意义的输出。谢谢! :)
  • 如果你愿意,你可以相应地编辑你的答案,我会接受的。
  • 刚刚注意到,如果省略 CONSOLE 定义,文件的唯一存在会导致所有日志记录输出消失。也就是说,这是真正的答案。
猜你喜欢
  • 1970-01-01
  • 2018-08-22
  • 2018-05-15
  • 2015-12-02
  • 2016-11-27
  • 2017-07-10
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多