日志选用问题
Slf4j+*,Commons Logging+Log4j组合是目前java项目开发常用的方案。
1.目前常用的集中日志框架
slf4j(Simple Logging Facade for Java) 是一套简易Java日志门面,本身并无日志的实现,slf4j是门面模式的典型应用。Commons Logging Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging(JCL),后更名为Commons Logging。Log4j Apache Log4j是一个基于Java的日志记录工具,是Apache软件基金会的一个项目。Log4j2 Apache Log4j 2是apache开发的一款Log4j的升级产品,与Log4j不兼容。Logback 一套日志组件的实现(Slf4j阵营),据称性能非常高。Logback和Slf4j是同一个作者。 Logback声称:某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在Logback中需要3纳秒,而在Log4J中则需要30纳秒。LogBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的。Jul (Java Util Logging) 自Java1.4以来的官方日志实现。
2.slf4j
Slf4j与其它日志组件调用关系图
3.Slf4桥接遗留的api
在实际环境中我们经常会遇到不同的组件使用的日志框架不同的情况,例如Spring Framework使用的是日志组件是Commons Logging,XSocket依赖的则是Java Util Logging。当我们在同一项目中使用不同的组件时应该如果解决不同组件依赖的日志组件不一致的情况呢?现在我们需要统一日志方案,统一使用Slf4j,把他们的日志输出重定向到Slf4j,然后Slf4j又会根据绑定器把日志交给具体的日志实现工具。Slf4j带有几个桥接模块,可以重定向Log4j,JCL和java.util.logging中的Api到Slf4j。log4j-over-slf4j-version.jar 将Log4j重定向到Slf4jjcl-over-slf4j-version.jar 将Commons Logging里的Simple Logger重定向到slf4jjul-to-slf4j-version.jar 将Java Util Logging重定向到Slf4j
4.在使用Slf4j桥接时要注意避免形成死循环
1)log4j-over-slf4j.jar和slf4j-log4j12.jar同时存在 由于slf4j-log4j12.jar的存在会将所有日志调用委托给log4j。但由于同时由于log4j-over-slf4j.jar的存在,会将所有对log4j api的调用委托给相应等值的slf4j,所以log4j-over-slf4j.jar和slf4j-log4j12.jar同时存在会形成死循环2)jul-to-slf4j.jar和slf4j-jdk14.jar同时存在 由于slf4j-jdk14.jar的存在会将所有日志调用委托给jdk的log。但由于同时jul-to-slf4j.jar的存在,会将所有对jul api的调用委托给相应等值的slf4j,所以jul-to-slf4j.jar和slf4j-jdk14.jar同时存在会形成死循环
参照原文