最近在应用中第一次接触到JUL(java.util.logging),顺便对自己使用过的日志框架做个简单的总结
Java里的日志框架很多,
open-open上面就记载了一大堆,比较常用的有Log4j, Jakarta Commons Logging (JCL), JUL, SLF4J, Logback等,主要可以分为两大类
一、完整的日志实现,比如Log4j, JUL, Logback
Log4j: JAVA里面出现最早,1999年由Ceki Glc创建。Log4j凭借强大的功能,简单的配置,丰富齐全的appender,灵活的自定义layout,成为使用最为广泛的日志框架。虽然面临Logback这样新兴框架的竞争,但在将来很长一段时间内,Log4j始终会是JAVA日志框架的主流
JUL: JDK1.4引进的日志系统。使用下来感觉是在Log4j基础上再造的轮子,对Log4j使用的名词概念做了一些重命名,但在功能与易用性上都比不上Log4j。对于简单的日志纪录还可以用用,至少不用导入第三方JAR包
Logback: JAVA日志框架的后起之秀,同样出自Log4j作者Ceki Glc之手,解决了很多Log4j遗留的问题,比起Log4j有更好的性能,支持自动重新装载配置文件等优点。很多开源项目有转向Logback的趋势,像Tapestry, Hibernate, Spring都已经采用logback,但想达到完全取代Log4j的目标,还需要很长一段时间
二、日志接口,比如JCL, SLF4J。只提供一个简单的日志操作接口,允许开发人员通过配置文件,使用不同的日志实现框架
JCL: Apache出品的日志接口,用于屏蔽Log4j与JUL的实现差异,JCL+Log4j是目前最主流的搭配
SLF4J: 同样是Log4j的作者Ceki Glc创建,用来取代JCL。Simple Logging Facade for Java,从它的名字就可以看出它只承担Facade的角色,允许开发以使用统一的日志接口,整合不同的日志实现。做为一个新兴的框架,它几乎对Log4j, JUL, Logback所有的实现框架都提供了支持。SLF4J支持参数化的log,比如在JCL里面,出于性能考虑,日志代码常常是这样的
logger.isDebugEnabled(){
logger.debug("user id : " + userId);
}
在SLF4J里面可以直接写
logger.debug("user id : {}", userId);
这么多框架该如何选择?
我觉得对于新的项目,完全可以考虑采用SLF4J+Logback, 它们跟Log4j都是由同一作者创建,概念上很相似,转移成本很小。SLF4J提供的参数化日志接口代码量更小,更清晰
对于老项目,如果不需要整合不同的日志实现,保留原来的框架就好,没必要为了日志功能而大作修改