本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用、依赖,好让我们平时在工作中如果遇到“日志打不出”或者“日志jar包冲突”等之类的问题知道该如何入手解决,以及在各种场景下如何调整项目中的各个框架的日志输出,使得输出统一。
在日常工作中我们可能看到项目中依赖的跟日志相关的jar包有很多,commons-logging.jar、log4j.jar、sl4j-api.jar、logback.jar等等,眼花缭乱。我们要正确的配置,使得jar包相互作用生效之前,就先要理清它们之间的关系。
那就要从Java Log的发展历程开始说起。
大概了解心路历程后,再详细看看它们之间的关系、依赖。
commons-logging已经停止更新,最后的状态如下所示:
JCL支持日志组件不多,不过也有很人用的,例如Spring 现在用的也越来越少了,也不多讲了
因为当时Java的日志组件比较混乱繁杂,Ceki Gülcü推出slf4j后,也相应为行业中各个主流日志组件推出了slf4j的适配 图来源于官方文档:http://www.slf4j.org/manual.html
图的意思为如果你想用slf4j作为日志门面的话,你如何去配合使用其他日志实现组件,这里说明一下(注意jar包名缺少了版本号,在找版本时也要注意版本之间是否兼容)
slf4j-api.jar + logback-classic.jar + logback-core.jar
slf4j-api.jar + slf4j-log4j12.jar + log4j.jar
slf4j-api.jar + slf4j-jdk14.jar
slf4j-api.jar + slf4j-nop.jar
slf4j支持各种适配,无论你现在是用哪种日志组件,你都可以通过slf4j的适配器来使用上slf4j。只要你切换到了slf4j,那么再通过slf4j用上实现组件,即上面说的。图来源于官方文档:https://www.slf4j.org/legacy.html
其实总的来说,无论就是以下几种情况
我在网上盗一张图,给大家一个整体的依赖图(懒得画了)
这就是为了对slf4j的适配做一个例子说明。Spring是用JCL作为日志门面的,那我们的应用是slf4j + logback,怎么让Spring也用到logback作为日志输出呢?这样的好处就是我们可以统一项目内的其他模块、框架的日志输出(日志格式,日志文件,存放路径等,以及其他slf4j支持的功能) 很简单,就是加入jcl-over-slf4j.jar就好了。我又盗了一个图来说明
其实很简单
slf4j的日志加载会在程序启动时把日志打出来,所以一定要注意,它会说明加载是否成功,加载了那个日志实现。slf4j已经对错误作了说明官网说明 下面讲一下可能经常遇到的问题
没找到日志实现,如果你觉得你已经写上了对应的日志实现依赖了,那你要检查一下了,一般来说极有可能是版本不兼容。
找到多个日志实现,slf4j会找其中一个作为日志实现。
阿里对此的代码规范:
“【强制】应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架 SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 ”
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Abc.class);
文章帮大家梳理了Java日志组件的关系,以及如何解决日常中常见日志相关的问题,希望对大家帮助。