Java日志,须要知道的几件事(commons-logging,log4j,slf4j,logback)

若是对于commons-loging、log4j、slf4j、LogBack等都已经很是清楚了,能够忽略本文。几回解决日志冲突问题时对这几个概念的简单总结,但愿对这块基础没有理解透的同窗能有所帮助,固然若是对这块有更深入理解的同窗,也贡献出本身的知识和看法。html

1、    概念java

Commons-logging:apache最先提供的日志的门面接口。避免和具体的日志方案直接耦合。相似于JDBC的api接口,具体的的JDBC driver实现由各数据库提供商实现。经过统一接口解耦,不过其内部也实现了一些简单日志方案。数据库

Log4j:经典的一种日志解决方案。内部把日志系统抽象封装成Logger、appender、pattern等实现。咱们能够经过配置文件轻松的实现日志系统的管理和多样化配置。apache

Slf4j: 全称为Simple Logging Facade for JAVA:java简单日志门面。是对不一样日志框架提供的一个门面封装。能够在部署的时候不修改任何配置便可接入一种日志实现方案。和commons-loging应该有同样的初衷。我的感受设从计上更好一些,没有commons那么多潜规则。同时有两个额外特色:api

1. 能支持多个参数,并经过{}占位符进行替换,避免老写logger.isXXXEnabled这种无奈的判断,带来性能提高见:http://www.slf4j.org/faq.html#logging_performance。app

2.OSGI机制更好兼容支持框架

一图胜千言,官网上的一个图:性能


 

从上图能够发现,选择仍是不少的。测试

Logback: Lack做为一个通用可靠、快速灵活的日志框架,将做为Log4j的替代和SLF4J组成新的日志系统的完整实现。官网上称具备极佳的性能,在关键路径上执行速度是log4j的10倍,且内存消耗更少。spa

 

2、 SLF4J 的几种实际应用模式--之一:SLF4J+Log4J

 

SLF4J(Simple Logging Facade for Java) 是一个通用的日志框架,不能何以谓之 Facade(门面),所扮眼的角色至关于 Jakarta Commons Logging。就像 JCL 须要底层的日志实现,如 Log4J、java.util.logging、Simple Logger 等来完成具体的信息输出,事实上基本老是 JCL+Log4J 那么一个绝配。SLF4J 的原旨也是能支持多种下层日志框架实现,但最好的日志实现仍然是 Log4J,因此本篇讲述 SLF4J 的第一种用法 SLF4J+Log4J。

须要的配置文件和组件包,下面三个 jar 文件和一个 properties 文件都是要放在项目的 ClassPath 上。

1. slf4j-api-1.5.11.jar
2. slf4j-log4j12-1.5.11.jar
3. log4j-1.2.15.jar
4. log4j.properties(也能够是 log4j.xml,本例中用 log4j.propertes)

前两个包在 http://www.slf4j.org/download.html 处下载,后一个包在http://logging.apache.org/log4j/1.2/download.html 下载,可能包文件名中的版本号有些差,没关系。

log4j.properties 之前该是怎么写,如今仍是怎么写,好比一个最简单的内容,只向控制台输出日志信息,以下:

[xml] view plain copy

 

  1. log4j.rootLogger=DEBUG,console  
  2. log4j.appender.console=org.apache.log4j.ConsoleAppender  
  3. log4j.appender.console.layout=org.apache.log4j.PatternLayout  
  4. log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n  

 

3、 SLF4J 的几种实际应用模式--之一:SLF4J+Logback

前面讲的 SLF4J 的用法之一是 SLF4J+Log4J,而这里要推出的组合是 SLF4J+LogBack。不用 Log4J?难道还有比 Log4J 更好的日志实现吗?是的,答案就是LogBack。假如你知道 LogBack 和 Log4J 是同出一位大师之手,你就不会以为惊讶了。LogBack 对 Log4J 进行了加强,并投入了 SLF4J 的怀抱,它还被做者认定为 Log4J 的继任者。

为何叫作 Logback,我就不知道了,反正不要叫作 Brokeback 就行。这里是推崇用 Logback 替代 Log4J 的十几个理由:Reasons to prefer logback over log4j,说的大至是更快;好测试;与 SLF4J 关系紧;文档丰富;能自动加载配置文件;多个 JVM 写一个日志文件,或其余 I/O 错误时不影响程序执行;配置文件中加入条件控制;强大的日志过滤;更强的日志切分功能;自动压缩、删除日志文件;异常栈中更多的数据信息。

Logback 分为三个模块:logback-core,logback-classic,logback-access。logback-core 是核心;logback-classic 改善了 log4j,且自身实现了 SLF4J API,因此即便用 Logback 你仍然可使用其余的日志实现,如原始的 Log4J,java.util.logging 等;logback-access 让你方便的访问日志信息,如经过 http 的方式。

还得提一点,Logback 能更好的放到 OSGI 环境中。好了,简单绍完了 Logback,就来看看具体怎么用它。

须要的配置文件和组件包,下面三个 jar 文件和一个 xml文件都是要放在项目的 ClassPath 上。

1. slf4j-api-1.5.11.jar
2. logback-core-0.9.20.jar
3. logback-classic-0.9.20.jar
4. logback.xml 或 logback-test.xml (相似于 log4j.properties/log4j.xml)

 

 

4、SLF4J怎样定位到具体用哪一个log

在应用中,经过LoggerFactory类的静态getLogger()获取logger。经过查看该类的代码能够看出,最终是经过StaticLoggerBinder.SINGLETON.getLoggerFactory()方法获取LoggerFactory而后,在经过该具体的LoggerFactory来获取logger的。类org.slf4j.impl.StaticLoggerBinder并不在slf4j-api-1.5.2.jar包中,仔细查看每一个与具体日志系统对应的jar包,就会发现,相应的jar包都有一个org.slf4j.impl.StaticLoggerBinder的实现,不一样的实现返回与该日志系统对应的LoggerFactory,所以就实现了所谓的静态绑定,达到只要选取不一样jar包就能简单灵活配置的目的。 

相关文章
相关标签/搜索