springboot 默认实现了日志框架,slf4j 作为抽象层,logback 作为实现层。springboot 把其他的日志框架都转换成 slf4j,用 logback 来实现。当然,我们也可以根据需要自己切换要使用的日志框架。
日志的使用
如下示例是 springboot 中日志框架使用的一个单元测试。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootLogTest {
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void logTest() {
logger.trace("这是trace日志");
logger.debug("这是debug日志");
logger.info("这是info日志"); // springboot 默认设置的 info级别
logger.warn("这是warn日志");
logger.error("这是error日志");
}
}
日志的级别:trace < debug < info < warn < error,我们可以在配置文件中设置级别,在这个级别及更高级别的日志就会被打印或输出到指定位置。
运行上述测试用例,日志打印如下图:可以知道 springboot 默认设置的打印级别是 info 级别,或者称为 root 级别。
如果要更改输出的日志级别,可以在配置文件 application.properties 中配置。如下配置指定 com.xiao 包下的类的日志级别为 trace,其他的类则使用默认的 springboot 设置的级别
logging.level.com.xiao=trace
如果不进行配置,日志默认只输出到控制台,如果想要输出到其他位置,需要在配置文件中进行配置。
#如果直接写文件名,则日志会输出到当前项目下;还可以写绝对路径,输出到指定盘符的文件中
#logging.file=springboot.log
#logging.file=F:/springboot.log
#在当前盘符的根路径下创建 springboot 文件夹,在里面创建 log 文件夹,
#日志会输出到其中的 默认文件 spring.log 中,
logging.path=/springboot/log
如果想要使用自己的配置文件,可以根据自己使用的日志框架创建一个对应的配置文件放在 classpath 路径下即可。对应关系如下:(带 -spring扩展名的由 springboot 解析日志配置,可以使用一些 springboot 的高级特性,如指定激活环境。)
Logging System | Customization |
---|---|
Logback | logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy |
Log4j2 | log4j2-spring.xml or log4j2.xml |
JDK (Java Util Logging) | logging.properties |
日志的输出格式也可以进行配置:
#指定控制台输出的日格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
#指定输出到文件中的日志格式
logging.pattern.file=%d{yyyy-MM-dd} --- [%thread] --- %-5level --- %logger{50} --- %msg%n
%d :表示日期时间
%thread :表示线程名
%-5level :级别从左显示5个字符宽度,- 表示左对齐
%logger{50} :表示 logger 名字最长为50个字符,否则按照句号分割
%msg :表示日志消息
%n :表示换行
日志框架的切换
由于 springboot 的日志框架默认是使用 slf4j + logback 实现的,如果有其他需要,可能相应换成其他实现的日志框架,springboot 也能支持切换成其他日志框架。
slf4j 的实现
springboot 默认是使用的 slf4j 的接口,logback 的实现。如果想用其他实现,该怎么办呢。可以在 slf4j 官网找到如下图:
例如:
- 如果 slf4j 要绑定 logback,我们的应用程序将调用 slf4j 接口,logback 进行实现,这种情况只要调用 slf4j 的 jar 包 (slf4j-api.jar )和 logback 的jar包(logback-classic.jar、logback-core.jar);
- 如果 slf4j 要绑定 log4j,我们的应用程序将调用 slf4j 接口,中间需要一个适配层 ,适配层调用了 log4j 的实现方法。用到了 slf4j 的 slf4j-api.jar 、适配层的 slf4j-log412.jar 和 log4j 的 log4j.jar 。
- 每个日志实现框架都有自己的配置文件,使用 slf4j 后,配置文件还是使用日志实现框架自己的配置文件
springboot 在使用其他框架时,其他框架可能使用的是其他日志框架,比较混乱。那么,如何统一日志框架呢?可以在官方网站找到如下图:
例如:
- 我想用统一使用 slf4j + logback,则该应用程序涉及的其他日志框架 commons logging 用 jcl-over-slf4j.jar 替换、log4j 用 log4j-over-slf4j.jar 替换、java.util.logging 用 jul-to-slf4j.jar 替换,这样,这些框架都可以使用 slf4j 接口调用了
- 不管要使用哪种日志实现,都是把其他实现框架的日志包排除,如果只是做排除,其他使用这个日志实现的框架可能无法正常运行,所以要用中间包替换原来的日志包,最后导入要使用的日志包。
日志框架的切换,可以根据上图对 jar 包依赖进行排除与补充
示例:
假如现在想用 log4j ,需要排除 springboot 默认依赖的 logback 依赖,log4j-over-slf4j.jar 是 log4j 转成 slf4j 要用的,而我们现在就是想用 log4j,所以不需要这个转换),slf4j-log4j12.jar 是 log4j 要用的中间包,需导入。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>