项目中经常使用日志,但都是参照别人的配置复制粘贴,这次碰到这几个名词产生疑惑,遂写下这篇笔记进行总结。
结论
官方文档中的一段话明确描述了三者的关系。slf4j
译为简单日志门面,是日志框架的抽象,笼统的讲就是slf4j
是一系列的日志接口,而log4j
和logback
是众多日志框架中的两种。
The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logback and log4j. SLF4J allows the end-user to plug in the desired logging framework at deployment time. Note that SLF4J-enabling your library/application implies the addition of only a single mandatory dependency, namely slf4j-api-1.7.21.jar.
实例验证
public class Program {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger(Program.class);
logger.info("hello world");
}
}
从运行结果可以看到,由于没有给出具体的logger
实现,无法在控制台输出日志。也就是说我们在具体开发中,需要绑定一个日志框架,才能正常的使用slf4j
。
log4j和logback
log4j和logback是两个受欢迎的日志框架,这两个框架都是同一个作者,logback拥有更好的特性,是用来取代log4j的。下图是slf4j官网中的一张图。
上图可以看到应用程序对日志框架的调用关系。应用程序调用slf4j api,而日志的输出最终是由底层的日志框架来实现的。这张图也体现了log4j和logback的不同。可以看到logback是直接实现了slf4j的接口,是不消耗内存和计算开销的。而log4j不是对slf4j的原生实现,所以slf4j api在调用log4j时需要一个适配层。
log4j和logback可以单独的使用,也可以绑定slf4j一起使用。
- 单独使用:分别调用框架自己的方法来输出日志信息。
- 绑定slf4j一起使用:调用slf4j的api来输入日志信息,具体使用与底层日志框架无关(需要底层框架的配置文件)
不推荐单独使用日志框架。假设项目中已经使用了log4j,而我们此时加载了一个类库,而这个类库依赖另一个日志框架。这个时候我们就需要维护两个日志框架,这是一个非常麻烦的事情。而使用了slf4j就不同了,由于应用调用的抽象层的api,与底层日志框架是无关的,因此可以任意更换日志框架。
slf4j绑定log4j或logback的用法比较常见,具体使用方法按照自己项目的需求进行配置。