在调用log
变量的方法来输出日志时,有以上5个级别对应的方法,从不太重要,到非常重要
调用不同的方法,就会输出不同级别的日志。
trace
:跟踪信息debug
:调试信息info
:一般信息warn
:警告信息error
:错误信息
问题:SpringBoot只打印了info等级的日志? 没有trace等级的日志?
原因:使用了Spring Boot(例如在测试类上添加了@SpringBootTest
注解),日志的默认显示级别是info
,则只会显示info
、warn
、error
级别的日志,不会显示trace
、debug
级别的日志。
解决方法
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
或者在application.properties
中添加配置
#实际尝试有效
logging.level.com.luoyang.small=TRACE
结果:
附加信息
提示: Mybatis框架会生成各Mapper接口的对象,这些对象在执行SQL语句时,也会输出日志。如果想看的trace
和info
级别的日志,也需要把日志的显示级别设置为较低的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个参数是字符串常量,是在内存中的字符串常量池中的,也可以一定程度上提高执行效率。
创造价值,乐哉分享!