Apache Commons Logging
Apache Commons Logging又叫做JakartaCommons Logging (JCL),它本身提供了简单的日志操作,但是它的主要作用是提供了一个日志操作门面接口,即让开发者不依赖具体的日志操作框架,可以根据需要切换日志框架。JCL不是具体的日志操作框架,而是一个日志门面框架。JCL对一些常用的日志操作框架进行了简单的封装,包括Log4J, Avalon LogKit, and JDK等。比如我们在使用log4j作为日志输出框架,就会在java文件中明确的引入具体的org.apache.log4j.Logger类,如果我们在想切换到其它日志操作框架会对程序翻天覆地的修改。而我们引入org.apache.commons.logging.Log,然后配置commons-loggin.properties配置文件来指定具体使用那个日志框架,在切换日志框架时,值需要更改配置文件即可。
JCL有两个基本的类:Log(日志记录器)和LogFactory(负责创建Log实例)。当commons-logging.jar被加入到CLASSPATH之后,它会合理地猜测你想用的日志工具,然后进行自我设置,用户根本不需要做任何设置。
JCL寻找具体日志框架的规则
JCL会按照下面的步骤去寻找程序使用的日志框架,找到第一个后将终止寻找。
1,寻找当前项目src下commons-logging.properties配置文件中名叫org.apache.commons.logging.Log配置属性的值
2,寻找系统中属性中名叫org.apache.commons.logging.Log的值
3,如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
4,如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger)
5,使用简易日志包装类(SimpleLog),JCL自带的简单日志操作功能
2,寻找系统中属性中名叫org.apache.commons.logging.Log的值
3,如果应用程序的classpath中有log4j,则使用相关的包装(wrapper)类(Log4JLogger)
4,如果应用程序运行在jdk1.4的系统中,使用相关的包装类(Jdk14Logger)
5,使用简易日志包装类(SimpleLog),JCL自带的简单日志操作功能
commons-logging.properties配置文件、
#使用JDK java.util.logging.Logger作为日志框架
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
#使用log4j作为日志框架,对于老的版本使用org.apache.commons.logging.impl.Log4JCategoryLog
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
#使用JCL自带的简单日志框架
#org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
对于JCL具体可以适配那些日志框架,可以到commons-logging JAR包中去查看,如图:
注意如果使用了那种日志框架,需要在工程中导入对应日志框架的JAR包。
log4j与JCL
JCT和log4j在使用时,通过包名我们可以发现它们都是 apache 的项目,既然如此,为何要动如此大的动作搞两个东西(指的是 commons-logging 和 log4j)出来呢?事实上,在 sun 开发 logger(JDK自带的日志系统) 前,apache 项目已经开发了功能强大的 log4j 日志工具,并向 sun 推荐将其纳入到 jdk 的一部分,可是 sun 拒绝了 apache 的提议,sun 后来自己开发了一套记录日志的工具。可是现在的开源项目都使用的是 log4j,log4j 已经成了事实上的标准,但由于又有一部分开发者在使用 sun logger,因此 apache 才推出 commons-logging,使得我们不必关注我们正在使用何种日志工具。
SLF4J
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志记录系统,它只服务于各种各样的日志系统。和JCL是一个性质的,SLF4J从名字上就表明了其含义和作用。按照官方的说法,SLF4J是一个用于日志系统的简单Facade(门面),允许最终用户在部署其应用时使用其所希望的日志系统。SLF4J和JCL一样,提供Logger(日志记录器)和LoggerFactory(负责创建Log实例)的工厂类。具体的日志的输出形式、记录级别、输出方法都由具体的日志框架配置完成。
SFL4J可适配的具体日志系统
SFL4J包的构成
使用SFL4J需要导入三个部分jar包:
1,slf4j-api-1.7.12.jar,提供了Logger接口和LoggerFactory工厂类。
2,slf4j-使用的具体日志系统名称-x.x.x.jar,实现了slf4j-api-1.7.12.jar中的Logger接口,并对具体的日志做适配,将slf4j和具体的日志系统联系起来。
3,具体的日志系统相关jar包。
1,slf4j-api-1.7.12.jar,提供了Logger接口和LoggerFactory工厂类。
2,slf4j-使用的具体日志系统名称-x.x.x.jar,实现了slf4j-api-1.7.12.jar中的Logger接口,并对具体的日志做适配,将slf4j和具体的日志系统联系起来。
3,具体的日志系统相关jar包。
slf4j+具体的日志组合需要导入的jar
使用SLF4J需要导入slf4j-api-x.x.x.jar、具体日志系统适配jar、日志系统jar。下面给了几个slf4j+具体的日志系统实现日志操作需要导入的包。slf4j-api-x.x.x.jar是必须导入的。1,使用log4j:log4j-1.2.17、slf4j-log4j12-1.7.12.jar
2,使用JDK自带的日志系统:slf4j-jdk14-1.7.12.jar
3,使用slf4j自带的简单日志输出系统:slf4j-simple-1.7.12.jar
以此类推...
如果工程中导入了多个适配包,SLF4J会给出如下提示:SLF4J: Class path contains multiple SLF4J bindings.并把每个日志系统都输出来。
将现有的日志系统切换到SLF4J
假如我们使用了JCL+log4j的方式作日志操作框架,那我们的工程依赖的log4j还是JCL?工程中导入那个日志框架的类,就说明工程依赖那个日志框架。例如我们工程中出现了这样一段代码:
import org.apache.commons.logging.LogFactory;
public class LogTest1 {
private static final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory.getLog(LogTest1.class);
public static void main(String [] args){
String aa = LogFactory.FACTORY_DEFAULT;
logger.info("hi,我是程序猿。"+aa);
}
}
这段代码说明工程依赖JCL。
如果导入import org.apache.log4j.Logger;说明依赖log4j。
现在我们想要更换系统日志门面框架,使用SLF4j替代JCL日志门面框架。只需要导入JCL对应的SLF4J桥接包,在删除JCL jar包即可。具体步骤如下:
SLF4J替换JCL:导入jcl-over-slf4j-1.7.12.jar,删除commons-logging-1.1.1.jar。
如果我们想使用SLF4J替换log4j,具体步骤如下:
SLF4J替换log4j:导入log4j-over-slf4j-1.7.12.jar,删除log4j-1.2.17.jar。
切换到了SLF4J,我们就可以按照SLF4J的方式(详见章节3)选择具体使用那种日志了。各种日志间的切换变得异常简单。在比如从log4j切换到slf4j提供的简单的日志系统的步骤:
1,导入桥接包log4j-over-slf4j-1.7.12.jar
2,删除log4j-1.2.17.jar
3,导入slf4j-api-1.6.6.jar
4,导入slf4j-simple-1.7.12.jar
ps:logback日志框架和slf4j的作者是同一个人。
SLF4J替换log4j:导入log4j-over-slf4j-1.7.12.jar,删除log4j-1.2.17.jar。
切换到了SLF4J,我们就可以按照SLF4J的方式(详见章节3)选择具体使用那种日志了。各种日志间的切换变得异常简单。在比如从log4j切换到slf4j提供的简单的日志系统的步骤:
1,导入桥接包log4j-over-slf4j-1.7.12.jar
2,删除log4j-1.2.17.jar
3,导入slf4j-api-1.6.6.jar
4,导入slf4j-simple-1.7.12.jar
ps:logback日志框架和slf4j的作者是同一个人。
参考文章:
slf4j-1.7.12.zip 下载地址: