Java日志体系总结
概要
Log日志体系
commons-logging.jar
、
log4j.jar
、
sl4j-api.jar
、
logback.jar
等等,眼花缭乱。我们要正确的配置,使得jar包相互作用生效之前,就先要理清它们之间的关系。
背景/发展史
-
log4j
(作者Ceki Gülcü)出来时就等到了广泛的应用(注意这里是直接使用),是Java日志事实上的标准,并成为了Apache的项目 -
Apache要求把log4j并入到JDK,SUN拒绝,并在jdk1.4版本后增加了 JUL
(java.util.logging
) -
毕竟是JDK自带的,JUL也有很多人用。同时还有其他日志组件,如SimpleLog等。这时如果有人想换成其他日志组件,如log4j换成JUL,因为api完全不同,就需要改动代码。 -
Apache见此,开发了 JCL
(Jakarta Commons Logging),即commons-logging-xx.jar
。它只提供一套通用的日志接口api,并不提供日志的实现。很好的设计原则嘛,依赖抽象而非实现。这样应用程序可以在运行时选择自己想要的日志实现组件。 -
这样看上去也挺美好的,但是log4j的作者觉得JCL不好用,自己开发出 slf4j
,它跟JCL类似,本身不提供日志具体实现,只对外提供接口或门面。目的就是为了替代JCL。同时,还开发出logback
,一个比log4j拥有更高性能的组件,目的是为了替代log4j。 -
Apache参考了logback,并做了一系列优化,推出了 log4j2
关系/依赖
JCL
commons-logging
已经停止更新,最后的状态如下所示:
SLF4J
-
slf4j + logback slf4j-api.jar
+logback-classic.jar
+logback-core.jar
-
slf4j + log4j slf4j-api.jar
+slf4j-log4j12.jar
+log4j.jar
-
slf4j + jul slf4j-api.jar
+slf4j-jdk14.jar
-
也可以只用slf4j无日志实现 slf4j-api.jar
+slf4j-nop.jar
SLF4J的适配
-
你在用JCL 使用 jcl-over-slf4j.jar
适配 -
你在用log4j 使用 log4j-over-slf4j.jar
适配 -
你在用JUL 使用 jul-to-slf4j.jar
适配
让Spring统一输出
jcl-over-slf4j.jar
就好了。我又盗了一个图来说明
适配思路
-
你首先确认需要统一日志的模块、框架是使用哪个日志组件的,然后再找到sfl4j的适配器。 -
记得去掉无用的日志实现组件,只保留你要用的。