java很火,日志记录又是必需,所以就有了大量的日志记录框架,在平常使用时由于日志框架冲突引起各类问题,本文对之进行梳理,适合入门。因为做者水平限制,本文可能不够清晰甚至有错,烦请指出。在文章末尾的参考部分,有几位大牛总结的文章,推荐给你们。html
下文将着重介绍上述日志框架的区别,以及避免不一样框架组合引入时的冲突。java
日志接口的具体实现。经典的有log4j,jdk自带的有java.util.Logging,还有log4j做者推出的被高度评价的logBack等等。apache
若是只存在一种日志系统,日志接口彻底没有必要存在(logBack没法独立使用)。但事与愿违,为了解决多个日志系统的兼容问题,日志接口应运而生。主流的日志接口有commons-logging和sl4j。api
1996年早期,欧洲安全电子市场项目组决定编写它本身的程序跟踪API(Tracing API)。通过不断的完善,这个API终于成为一个十分受欢迎的Java日志软件包,即Log4j。后来Log4j成为Apache基金会项目中的一员。安全
期间Log4j近乎成了Java社区的日志标准。听说Apache基金会还曾经建议sun引入Log4j到java的标准库中,但Sun拒绝了。框架
2002年Java1.4发布,Sun推出了本身的日志库JUL(Java Util Logging),其实现基本模仿了Log4j的实现。在JUL出来之前,log4j就已经成为一项成熟的技术,使得log4j在选择上占据了必定的优点。工具
接着,Apache推出了Jakarta Commons Logging,JCL只是定义了一套日志接口(其内部也提供一个Simple Log的简单实现),支持运行时动态加载日志组件的实现,也就是说,在你应用代码里,只需调用Commons Logging的接口,底层实现能够是log4j,也能够是Java Util Logging。性能
后来(2006年),Ceki Gülcü不适应Apache的工做方式,离开了Apache。而后前后建立了slf4j(日志门面接口,相似于Commons Logging)和Logback(Slf4j的实现)两个项目,并回瑞典建立了QOS公司,QOS官网上是这样描述Logback的:The Generic,Reliable Fast&Flexible Logging Framework(一个通用,可靠,快速且灵活的日志框架)。.net
现今,Java日志领域被划分为两大阵营:Commons Logging阵营和SLF4J阵营。
Commons Logging在Apache大树的笼罩下,有很大的用户基数。但有证据代表,形式正在发生变化。2013年末有人分析了GitHub上30000个项目,统计出了最流行的100个Libraries,能够看出slf4j的发展趋势更好:debug
Apache眼看有被Logback反超的势头,于2012-07重写了log4j 1.x,成立了新的项目Log4j 2。Log4j 2具备logback的全部特性。
至此,你应该了解了它们之间的区别,下面就说说使用时jar包的引入,避免冲突
若是你是Commons Logging系,那么最主流的组合Commons Logging + Log4j是你最好的选择。
<dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
若是你是Slf4j系,Slf4j + Logback组合是你最佳的选择,固然也有人愿意用Slf4j + Slf4j-Log4j + Log4j。
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.0</version> <type>jar</type> <scope>compile</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>0.9.28</version> <type>jar</type> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>0.9.28</version> <type>jar</type> </dependency>
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
建议选好一个组合后,严格按照以上导包(包的版本自行选择),这样作将很大程度上的避免冲突。
特别注意:Logback和Slf4j-Log4j12互斥,若是项目中同时存在,会引起冲突。
固然,Slf4j还有不少组合,可能也有项目用到,本文再也不一一说明:
若是是在一个新的项目中建议使用Slf4j + Logback组合,这样有以下的几个优势。
Logback拥有更好的性能
Logback声称:某些关键操做,好比断定是否记录一条日志语句的操做,其性能获得了显著的提升。这个操做在Logback中须要3纳秒,而在Log4J中则须要30纳秒。LogBack建立记录器(logger)的速度也更快:13毫秒,而在Log4J中须要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而Log4J须要2234纳秒,时间减小到了1/23。跟JUL相比的性能提升也是显著的。Commons Logging开销更高
在使Commons Logging时为了减小构建日志信息的开销,一般的作法是:
if(log.isDebugEnabled()){ log.debug("User name: " + user.getName() + " buy goods id :" + good.getId()); }
在Slf4j阵营,你只需这么作:
log.debug("User name:{} ,buy goods id :{}", user.getName(),good.getId());
也就是说,slf4j把构建日志的开销放在了它确认须要显示这条日志以后,减小内存和cup的开销,使用占位符号,代码也更为简洁
Logback文档免费。Logback的全部文档是全面免费提供的,不象Log4J那样只提供部分免费文档而须要用户去购买付费文档。