一、日志门面与日志实现
日志门面:即一个统一的接口层(日志的一个抽象层);
日志实现:即项目中具体使用的哪个日志框架。
下图是目前常见和常用的日志门面是实现。
而SpringBoot选择的是:SLF4j和Logback;
需要说明一下,JCL最后的一次更新是在2014年了,jobss-logging适用的场景过少。事实上SLF4j和Log4j,Logback都是由同一个人开发出来的,而Log4j2事实上仅仅是为了蹭Log4j的热度(这是我自己瞎想的),是由apache公司开发的一个日志框架,目前尚未得到很好的兼容。而Logback是Log4j的升级版本,性能更加的优越,因此springboot最终选择的是SLF4j和Logback。
注:以上观点属于个人观点,不接受反驳和喷子!
二、在SpringBoot项目中使用SLF4j
注:在真实开发项目中,我们一般都是直接调用的是接口,即抽象层的方法,再由接口去调用其实现类的方法。
SLF4j的官方文档:https://www.slf4j.org/
官方示例:
此时项目中以有SLF4j和Logback的依赖:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
官方示例一:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(HelloWorld.class);
logger.info("Hello World");
}
}
官方示例二:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Wombat {
final Logger logger = LoggerFactory.getLogger(Wombat.class);
Integer t;
Integer oldT;
public void setTemperature(Integer temperature) {
oldT = t;
t = temperature;
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
if(temperature.intValue() > 50) {
logger.info("Temperature has risen above 50 degrees.");
}
}
}
由于每一个日志实现的框架都有自己的配置文件,因此即便使用了slf4j接口层,但配置文件还是日志实现的配置文件。
三、SLF4j对其他日志框架的兼容
SpringBoot选择的是SLF4j和Logback,已经是很好的日志框架了,为什么还需要兼容其他的日志框架呢?原因在于,往往一个springboot项目同时也会依赖其他的框架,例如spring使用的是JCL,hiberbate使用的日志框架是jsboss-logging等等;如果不进行统一的日志管理,那么整个项目的日志就会显得杂乱,甚至会出现迷之错误。幸好这一点springboot已经为我们考虑到了,并作出了很好的解决方案。
即如下图所示(来源于官方文档),在这之间加一个适配层。意思就是当这个项目需要用到JCL(Jakarta Commons Logging)
日志框架的时候,在maven导入依赖时却并不导入JCL(Jakarta Commons Logging)的相关依赖,而是导入如图所示的替换依赖jar包(jcl-over-slf4j.jar),此时jcl-over-slf4j.jar会将JCL替换掉。其他的以此类推。
未完待续~~~~