SLF4J
Simple Logging Facade for Java (SLF4J) 简单日志门面
Simple Logging Facade for Java (SLF4J)
https://www.slf4j.org/
@Slf4j 注解
为了避免每个类中都要写一遍如下获取日志门面的代码
private static final Logger logger = LoggerFactory.getLogger(Application.class);
可以在类上写上加 @Slf4j
注解,然后直接用 log
实例打印日志
@Slf4j
public class LoggerTest {
@Test
public void test2(){
log.debug("debug");//默认日志级别为info
log.info("info");
log.warn("warn");
log.error("error");
}
}
如果注解 @Slf4j 后找不到变量 log,需要IDEA安装lombok插件
ettings -> Plugins -> Search in repositories 输入 lombok 搜索安装。
门面模式
slf4j是门面模式的典型应用。
门面模式,其核心为外部与一个子系统的通信必须通过一个统一的外观对象进行,使得子系统更易于使用。
门面模式的核心为Facade即门面对象,门面对象核心为几个点:
- 知道所有子角色的功能和责任
- 将客户端发来的请求委派到子系统中,没有实际业务逻辑
- 不参与子系统内业务逻辑的实现
为什么要用日志门面?
我们自己的系统中使用了logback这个日志系统
我们的系统使用了A.jar,A.jar中使用的日志系统为log4j
我们的系统又使用了B.jar,B.jar中使用的日志系统为slf4j-simple
这样,我们的系统就不得不同时支持并维护logback、log4j、slf4j-simple三种日志框架,非常不便。
解决这个问题的方式就是引入一个适配层,由适配层决定使用哪一种日志系统,而调用端只需要做的事情就是打印日志而不需要关心如何打印日志,slf4j或者commons-logging就是这种适配层
slf4j只是一个日志标准,并不是日志系统的具体实现。
slf4j实现原理
slf4j中获取日志门面的方式:
Logger logger = LoggerFactory.getLogger(Object.class);
跟进源码,发现在初始化时会执行一个 bind()
方法,其中会去当前 classpath 中找 “org/slf4j/impl/StaticLoggerBinder.class”, 而所有 slf4j 的实现,在提供的jar包路径下,一定是有”org/slf4j/impl/StaticLoggerBinder.class”存在的,所以只要引入了 slf4j 的实现,比如 slf4j-simple、logback、slf4j-log4j12,slf4j 就能自动找到他们。
如果在系统中同时引入多个slf4j的实现,启动时会出现警告有多个实现,并自动选择一个实现类。
Java日志框架:slf4j作用及其实现原理
https://www.cnblogs.com/xrq730/p/8619156.html
为什么阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback)中的 API
https://www.hollischuang.com/archives/3000
上一篇 VIM