如何设置Spring Boot测试时的日志级别

 更新时间:2019年06月10日 09:30:18   作者:锅外的大佬  
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。下面我们来一起学习一下吧

1.概览

该教程中,我将向你展示:如何在测试时设置spring boot 日志级别。虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测试,选择正确的日志级别是非常重要的。

2.日志级别的重要性

正确设置日志级别可以节省我们许多时间。

举例来说,如果测试在CI服务器上失败,但在开发服务器上时却通过了。我们将无法诊断失败的测试,除非有足够的日志输出。

为了获取正确数量的详细信息,我们可以微调应用程序的日志级别,如果发现某个java包对我们的测试更加重要,可以给它一个更低的日志级别,比如DEBUG。类似地,为了避免日志中有太多干扰,我们可以为那些不太重要的包配置更高级别的日志级别,例如INFO或者ERROR。

一起来探索设置日志级别的各种方法吧!

3. application.properties中的日志设置

如果想要修改测试中的日志级别,我们可以在src/test/resources/application.properties设置属性:

logging.level.com.baeldung.testloglevel=DEBUG

该属性将会为指定的包com.baeldung.testloglevel设置日志级别。

同样地,我们可以通过设置root日志等级,更改所有包的日志级别

logging.level.root=INFO

现在通过添加REST端点写入日志,来尝试下日志设置。

@RestController
public class TestLogLevelController {
private static final Logger LOG = LoggerFactory.getLogger(TestLogLevelController.class);
@Autowired
private OtherComponent otherComponent;
@GetMapping("/testLogLevel")
public String testLogLevel() {
LOG.trace("This is a TRACE log");
LOG.debug("This is a DEBUG log");
LOG.info("This is an INFO log");
LOG.error("This is an ERROR log");
otherComponent.processData();
return "Added some log output to console...";
}
}

正如所料,如果我们在测试中调用这个端点,我们将可以看到来自TestLogLevelController的调试日志。

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

这样设置日志级别十分简单,如果测试用@SpringBootTest注解,那么我们肯定应该这样做。但是,如果不使用该注解,则必须以另一种方式配置日志级别。

3.1 基于Profile的日志设置

尽管将配置放在src\test\application.properties在大多数场景下好用,但在某些情况下,我们可能希望为一个或一组测试设置不同的配置。

在这种情况下,我们可以使用@ActiveProfiles注解向测试添加一个Spring Profile:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, classes = TestLogLevelApplication.class)
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
@ActiveProfiles("logging-test")
public class TestLogLevelWithProfileIntegrationTest {
// ...
}

日志设置将会存在src/test/resources目录下的application-logging-test.properties中:

logging.level.com.baeldung.testloglevel=TRACE
logging.level.root=ERROR

如果使用描述的设置调用TestLogLevelCcontroller,将看到controller中打印的TRACE级别日志,并且不会看到其他包出现INFO级别以上的日志。

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

4.配置Logback

如果使用Spring Boot默认的Logback,可以在src/test/resources目录下的logback-text.xml文件中设置日志级别:

<configuration>
 <include resource="/org/springframework/boot/logging/logback/base.xml"/>
 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
   <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
   </pattern>
  </encoder>
 </appender>
 <root level="error">
  <appender-ref ref="STDOUT"/>
 </root>
 <logger name="com.baeldung.testloglevel" level="debug"/>
</configuration>

以上例子如何在测试中为Logback配置日志级别。

root日志级别设置为INFO,com.baeldung.testloglevel包的日志级别设置为DEBUG。

再来一次,看看提交以上配置后的日志输出情况

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

4.1 基于Profile配置Logback

另一种配置指定Profile文件的方式就是在application.properties文件中设置logging.config属性:

logging.config=classpath:logback-testloglevel.xml

或者,如果想在classpath只有一个的Logback配置,可以在logbacl.xml使用springProfile属性。

<configuration>
 <include resource="/org/springframework/boot/logging/logback/base.xml"/>
 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  <encoder>
   <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
   </pattern>
  </encoder>
 </appender>
 <root level="error">
  <appender-ref ref="STDOUT"/>
 </root>
 <springProfile name="logback-test1">
  <logger name="com.baeldung.testloglevel" level="info"/>
 </springProfile>
 <springProfile name="logback-test2">
  <logger name="com.baeldung.testloglevel" level="trace"/>
 </springProfile>
</configuration>

现在使用logback-test1配置文件调用TestLogLevelController,将会获得如下输出:

2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

另一方面,如果更改配置为logback-test2,输出将变成如下:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

5.可选的Log4J

另外,如果我们使用Log4J2,我们可以在src\main\resources目录下的log4j2-spring.xml文件中配置日志等级。

<Configuration>
 <Appenders>
  <Console name="Console" target="SYSTEM_OUT">
   <PatternLayout
     pattern="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
  </Console>
 </Appenders>
 <Loggers>
  <Logger name="com.baeldung.testloglevel" level="debug" />
  <Root level="info">
   <AppenderRef ref="Console" />
  </Root>
 </Loggers>
</Configuration>

我们可以通过application.properties中的logging.config属性来设置Log4J 配置的路径。

logging.config=classpath:log4j-testloglevel.xml

最后,查看使用以上配置后的输出:

2019-04-01 14:08:27.545 DEBUG 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is a DEBUG log
2019-04-01 14:08:27.545 INFO 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an INFO log
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.testloglevel.TestLogLevelController : This is an ERROR log
2019-04-01 14:08:27.546 INFO 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an INFO log from another package
2019-04-01 14:08:27.546 ERROR 56585 --- [nio-8080-exec-1] c.b.component.OtherComponent : This is an ERROR log from another package

6.结论

在本文中,我们学习了如何在Spring Boot测试应用程序时设置日志级别,并探索了许多不同的配置方法。在Spring Boot应用程序中使用application.properties设置日志级别是最简便的,尤其是当我们使用@SpringBootTest注解时。

与往常一样,这些示例的源代码都在GitHub上。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot整合resilience4j实现接口限流

    SpringBoot整合resilience4j实现接口限流

    最近在开发项目的时候,需要用到限流的功能,本文主要介绍了SpringBoot整合resilience4j实现接口限流,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • java读取excel文件并复制(copy)文件到指定目录示例

    java读取excel文件并复制(copy)文件到指定目录示例

    这篇文章主要介绍了java读取excel文件并复制文件到指定目录示例,需要的朋友可以参考下
    2014-02-02
  • SpringBoot实现接口数据的加解密功能

    SpringBoot实现接口数据的加解密功能

    这篇文章主要介绍了SpringBoot实现接口数据的加解密功能,对接口的加密解密操作主要有两种实现方式,文中给大家详细介绍,需要的朋友可以参考下
    2019-10-10
  • Java如何使用SSLContext请求https链接

    Java如何使用SSLContext请求https链接

    这篇文章主要介绍了Java如何使用SSLContext请求https链接问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Spring Boot虚拟线程Webflux在JWT验证和MySQL查询性能比较

    Spring Boot虚拟线程Webflux在JWT验证和MySQL查询性能比较

    这篇文章主要为大家介绍了Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 使用Java实现MySQL数据锁定的策略

    使用Java实现MySQL数据锁定的策略

    在并发环境下,多个线程同时对MySQL数据库进行读写操作可能会导致数据冲突和不一致的问题,为了解决这些并发冲突,我们可以采用数据锁定策略来保证数据的一致性和完整性,下面将介绍如何使用Java实现MySQL数据锁定策略,,需要的朋友可以参考下
    2023-08-08
  • java的主要特性学习总结

    java的主要特性学习总结

    在本篇文章里小编给大家分享了一篇关于java的主要特性学习总结内容,有兴趣的朋友们可以参考下。
    2020-05-05
  • IntelliJ IDEA 常用设置(配置)吐血整理(首次安装必需)

    IntelliJ IDEA 常用设置(配置)吐血整理(首次安装必需)

    这篇文章主要介绍了IntelliJ IDEA 常用设置(配置)吐血整理(首次安装必需),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java线上CPU内存冲高问题排查解决步骤

    Java线上CPU内存冲高问题排查解决步骤

    这篇文章主要介绍了Java线上CPU内存冲高问题排查解决步骤的相关资料,Java程序在实际生产过程中经常遇到CPU或内存使用率高的问题,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Java两种方式实现动态代理

    Java两种方式实现动态代理

    Java 在 java.lang.reflect 包中有自己的代理支持,该类(Proxy.java)用于动态生成代理类,只需传入目标接口、目标接口的类加载器以及 InvocationHandler 便可为目标接口生成代理类及代理对象。我们称这个Java技术为:动态代理
    2020-10-10

最新评论