日志接口
jcl slf4j
日志实现
log4j log4j2 logback jul/java.util.logging/jdk14 jcl默认实现 slf4j默认实现
JCL (jcl/common-logging/Apache Commons Logging)
apache提供的一个通用的日志接口。用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, common-logging会通过动态查找的机制,在程序运行时自动找出真正使用的日志库。当然,common-logging内部有一个Simple logger的简单实现,但是功能很弱 LogFactory 内部装载日志系统的流程如下: 首先,寻找org.apache.commons.logging.LogFactory 属性配置。 否则,利用JDK1.3 开始提供的service 发现机制,会扫描classpath 下的META-INF/services/org.apache.commons.logging.LogFactory文件,若找到则装载里面的配置,使用里面的配置。 否则,从Classpath 里寻找commons-logging.properties ,找到则根据里面的配置加载。 否则,使用默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用JDK14Logger 实现,再没有则使用commons-logging 内部提供的SimpleLog 实现
common-logging动态查找原理
Log 是一个接口声明。LogFactory 的内部会去装载具体的日志系统,并获得实现该Log 接口的实现类。LogFactory 内部装载日志系统的流程: 首先,寻找org.apache.commons.logging.LogFactory 属性配置。 否则,利用JDK1.3 开始提供的service 发现机制,会扫描classpah 下的META-INF/services/org.apache.commons.logging.LogFactory文件,若找到则装载里面的配置,使用里面的配置。 否则,从Classpath 里寻找commons-logging.properties ,找到则根据里面的配置加载。 否则,使用默认的配置:如果能找到Log4j 则默认使用log4j 实现,如果没有则使用JDK14Logger 实现,再没有则使用commons-logging 内部提供的SimpleLog 实现
主要类
LogLogFactory
jcl使用组合
commons-logging-1.1.jar + log4j-1.2.15.jarcommons-logging-1.1.jar + Java Logging API
slf4j (Simple Logging Facade for JAVA)
java简单日志门面。类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库 SLF4J 会在编译时会绑定import org.slf4j.impl.StaticLoggerBinder; 该类里面实现对具体日志方案的绑定接入。任何一种基于slf4j的实现都要有一个这个类
slf4j静态编译绑定原理
SLF4J 会在编译时会绑定import org.slf4j.impl.StaticLoggerBinder; 该类里面实现对具体日志方案的绑定接入。任何一种基于slf4j 的实现都要有一个这个类。如:org.slf4j.slf4j-log4j12-1.5.6: 提供对 log4j 的一种适配实现。注意:如果有任意两个实现slf4j 的包同时出现,那么就可能出现问题
主要类
LoggerLoggerFactory
slf4j使用组合
slf4j-api(接口层) + 各日志实现包的连接层( slf4j-jdk14, slf4j-log4j) + 各日志实现包:slf4j-api-1.6.1.jarslf4j-api-1.6.1.jar + slf4j-nop-1.6.1.jarslf4j-api-1.6.1.jar + slf4j-simple-1.6.1.jarslf4j-api-1.6.1.jar + slf4j-log4j12-1.6.1.jar + log4j.jarslf4j-api-1.6.1.jar + slf4j-jdk14.jar + jdk(java.util.logging)slf4j-api-1.6.1.jar + logback-classic.jar+logback-core.jar
slf4j+log4j vs jcl+log4j
1.SLF4j+Log4j 与 JCL+Log4J 的使用方式差不多,主要差异就在 SLF4J 用 jar 来告知用哪种日志实现,而 JCL 是通过配置文件来获得该选择哪个日志实现2.SLF4J 受类加载器的影响较小,不易产生内存溢出的问题,性能得到了改善,也顺应了潮流的发展--可方便部署到 OSGI 环境中