在调用log变量的方法来输出日志时,有以上5个级别对应的方法,从不太重要,到非常重要
调用不同的方法,就会输出不同级别的日志。

  • trace:跟踪信息
  • debug:调试信息
  • info:一般信息
  • warn:警告信息
  • error:错误信息

问题:SpringBoot只打印了info等级的日志? 没有trace等级的日志?

spring 不打印日志bug springboot日志突然不打印了_java

原因:使用了Spring Boot(例如在测试类上添加了@SpringBootTest注解),日志的默认显示级别是info,则只会显示infowarnerror级别的日志,不会显示tracedebug级别的日志。

解决方法

1.首先我们确认使用了工具打印日志
在pom.xml中添加依赖

<!-- Lombok的依赖项,主要用于简化POJO类的编写 -->
        <!-- 添加了Lombok后,在任何类的声明之前,添加@Slf4j注解,则编译期会自动声明一个名为log的变量,所以,可以在类中通过此变量来输出日志。 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
            <scope>provided</scope>
        </dependency>

使用前,在任何类的声明之前,添加@Slf4j注解,如下则编译期会自动声明一个名为log的变量

@Slf4j
@SpringBootTest
class SmallApplicationTests {
    @Test
    void logTest(){
        int x = 1;
        int y = 2;
        System.out.println("x = " + x + ", y = " + y + ", x + y = " + (x + y)); // 传统做法
        log.trace("111x = {}, y = {}, x + y = {}", x , y , x + y); // 使用日志输出变量的做法
        log.debug("222x = {}, y = {}, x + y = {}", x , y , x + y); // 使用日志输出变量的做法
        log.info("333x = {}, y = {}, x + y = {}", x , y , x + y); // 使用日志输出变量的做法
        log.warn("444x = {}, y = {}, x + y = {}", x , y , x + y); // 使用日志输出变量的做法
        log.error("555x = {}, y = {}, x + y = {}", x , y , x + y); // 使用日志输出变量的做法
    }
}

2.配置展示日志等级
在Spring Boot项目中,可以在配置文件(application.properties / application.yml / 相关Profile配置)中配置logging.level.包名属性,以指定某个包下的所有类的默认日志显示级别,此属性的值为5个级别中的某1个。

例如,在application.yml添加配置:

#加载Spring Boot的情况下,日志的默认显示级别是info,只会显示此级别及更加重要的级别的日志info.warn,error
#为了所有日志都现在,包括trace(跟踪日志),debug (调试日志)
#实际尝试有效
logging:
  level:
    com.luoyang.small: trace

spring 不打印日志bug springboot日志突然不打印了_spring boot_02

或者在application.properties中添加配置

#实际尝试有效
logging.level.com.luoyang.small=TRACE

结果:

spring 不打印日志bug springboot日志突然不打印了_spring boot_03

spring 不打印日志bug springboot日志突然不打印了_spring 不打印日志bug_04

附加信息

提示: Mybatis框架会生成各Mapper接口的对象,这些对象在执行SQL语句时,也会输出日志。如果想看的traceinfo级别的日志,也需要把日志的显示级别设置为较低的trace级别

日志占位符: 在调用日志的方法时,如果输出的信息中包含变量值,可以使用{}作为占位符,表示此处是一个变量值,然后,通过Object... args依次传入各占位符对应的值,如下:

@Test
    void logTest(){
        int x = 1;
        int y = 2;
        System.out.println("x = " + x + ", y = " + y + ", x + y = " + (x + y)); // 传统做法
        log.trace("111x = {}, y = {}, x + y = {}", x , y , x + y); // 使用日志输出变量的做法
    }

以上使用日志输出时,不会涉及到字符串的拼接,所以,执行效率会更高。并且,以上方法的第1个参数是字符串常量,是在内存中的字符串常量池中的,也可以一定程度上提高执行效率。

创造价值,乐哉分享!