日志框架 SLF4j

是什么:

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统

为什么:

在java.util.logging, logback, log4j等日志系统存在的基础上,为什么要用slf4j框架作为一个门面呢?

SLF4J 是一个日志抽象层,允许你使用任何一个日志系统,并且可以随时切换还不需要动到已经写好的程序。这对于第三方组件的引入的不同日志系统来说几乎零学习成本了,况且它的优点不仅仅这一个而已,还有简洁的占位符的使用和日志级别的判断,众所周知的日志读写一定会影响系统的性能,但这些特性都是对系统性能友好的。

怎么用:

只需要在maven中引入slf4j的依赖:

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.25</version>
		</dependency>

引入你需要使用的日志系统的依赖,由于log4j需要配置文件,为了方便,选用了其他的一些日志系统:

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-simple</artifactId>
			<version>1.7.22</version>
		</dependency>

在代码中即可:

Logger logger = LoggerFactory.getLogger(Object.class);

看一下打印的日志:

如果需要更换日志系统时,只需要将相关的日志系统的依赖替换即可。这儿选择替换成了

<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-jdk14</artifactId>
			<version>1.7.22</version>
		</dependency>

再看一下同样的代码打印出来的日志:

是不是日志系统切换很方便,没有侵入性呢?这也就是slf4j这么推荐的原因。

阿里巴巴 Java 开发手册有这么一段:

【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架
SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);

如何实现

那这个slf4j这么方便,是如何做到的呢?可以通过LoggerFactory.getLogger进去看一下他的实现原理:进入该方法后


可以获取logger的工厂,通过工厂获取该实例。

那是如何根据引入的jar包来动态获取logger工厂的呢?初始化的时候

if (INITIALIZATION_STATE == UNINITIALIZED) {...} 该条件是成立的,所以会进行初始化

下面这个bind方法为关键的方法

看一下bind方法的具体实现,标红的方法会找到可能的logger的path集合:

跟进去看一下,系统会扫描org/slf4j/impl/StaticLoggerBinder.class,并放入一个集合。

可以猜想一下:是不是所有的日志系统里都有这个类呢?可以看一下:

在获取到日志系统staticLoggerBinder.class的集合后,如果同时引入了多个日志系统,reportMultipleBindingAmbiguity方法中会打印出warn日志。

真正绑定的是下面的一行代码:

StaticLoggerBinder.getSingleton();

看一下该类的引用:

import org.slf4j.impl.StaticLoggerBinder;

但是该类StaticLoggerBinder在slf4j的jar包中并没有,org.slf4j.impl这个包也没有。而是引用的具体日志系统中的StaticLoggerBinder。如果没有引用具体的日志系统的话,就会出现catch中的警告:

有了StaticLoggerBinder这个类之后。通过

StaticLoggerBinder.getSingleton().getLoggerFactory(),不同的StaticLoggerBinder其getLoggerFactory实现不同,拿到ILoggerFactory之后调用一下getLogger即拿到了具体的Logger,可以使用Logger进行日志输出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每年进步一点点

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值