Java日志框架:SLF4J, Apache Common-Logging, Log4J和Logback

Log4j

Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改程序代码。

LOGBack

Logback是由log4j创始人设计的又一个开源日记组件。logback当前分成三个模块:logback-core,logback-classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个改良版本。此外logback-classic完整实现SLF4JAPI使你可以很方便地更换成其它日记系统如log4j或JDK14Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。

Log4Jvs.LOGBack

LOGBack作为一个通用可靠、快速灵活的日志框架,将作为Log4j的替代和SLF4J组成新的日志系统的完整实现。LOGBack声称具有极佳的性能,“某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LogBack中需要3纳秒,而在Log4J中则需要30纳秒。LogBack创建记录器(logger)的速度也更快:13微秒,而在Log4J中需要23微秒。更重要的是,它获取已存在的记录器只需94纳秒,而Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的”。

另外,LOGBack的所有文档是全面免费提供的,不象Log4J那样只提供部分免费文档而需要用户去购买付费文档。

SLF4J

简单日记门面(Facade)SLF4J是为各种logingAPIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的logingAPIs实现。LoggingAPI实现既可以选择直接实现SLF4J接的logingAPIs如:NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。

ApacheCommon-Logging

目前广泛使用的Java日志门面库。通过动态查找的机制,在程序运行时自动找出真正使用的日志库。但由于它使用了ClassLoader寻找和载入底层的日志库,导致了象OSGI这样的框架无法正常工作,由于其不同的插件使用自己的ClassLoader。OSGI的这种机制保证了插件互相独立,然而确使ApacheCommon-Logging无法工作。

SLF4Jvs.ApacheCommon-Logging

SLF4J库类似于ApacheCommon-Logging。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合。如此便可以在OSGI中使用了。

另外,SLF4J支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug(“currentuseris:{}”,user)。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。同时,日志中的参数若超过三个,则需要将参数以数组的形式传入,如:

Object[]params={value1,value2,value3};

logger.debug(“firstvalue:{},secondvalue:{}andthirdvalue:{}.”,params);

现在,Hibernate、Jetty、Spring-OSGi、Wicket和MINA等项目都已经迁移到了SLF4J,由此可见SLF4J的影响力不可忽视。

使用CommonLog接口而实际由SLF4J和Log4j实现的过程

1、项目中照常使用

importorg.apache.commons.logging.Log;

importorg.apache.commons.logging.LogFactory;

编写日志。

2、仍然在src下使用log4j.properties文件进行配置。

3、使用的所有jar文件:

1)log4j-1.2.15.jar这是log4j的库。SLF4J并不改变这个底层实现库。

2)slf4j-api-1.5.2.jar这是SLF4J库。

3)slf4j-log4j12-1.5.2.jar这包含Log4j的适配器和静态绑定log4j底层实现。

4)jcl-over-slf4j-1.5.2.jar这提供了Commons-Logging接口,以及使用common-loggin的接口,底层还是由SLF4J来决定哪种实现机制。

这里,我们需要使用Log4j的原生库,但是不需要Commons-Logging的原生库。

一切就绪,把上面这4个jar包复制到lib下,导入项目中,就可以像以往一样继续使用ApacheCommon-Logging编写日志了。

看一看logback.xml的配置

<?xmlversion="1.0"encoding="UTF-8"?>

<configuration>

<substitutionPropertyname="log.base"value="../logs/hzg"/>

<jmxConfigurator/>

<appendername="stdout"class="ch.qos.logback.core.ConsoleAppender">

<layoutclass="ch.qos.logback.classic.PatternLayout">

<pattern>�te[%thread]%-5level%logger{80}-%msg%n</pattern>

</layout>

</appender>

<!--文件输出日志(文件大小策略进行文件输出,超过指定大小对文件备份)-->

<appendername="logfile"class="ch.qos.logback.core.rolling.RollingFileAppender">

<Encoding>UTF-8</Encoding>

<File>${log.base}.log</File>

<rollingPolicyclass="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

<FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern>

</rollingPolicy>

<triggeringPolicyclass="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">

<MaxFileSize>2MB</MaxFileSize>

</triggeringPolicy>

<layoutclass="ch.qos.logback.classic.PatternLayout">

<pattern>�te[%thread]%-5level%logger{80}-%msg%n</pattern>

</layout>

</appender>

<!--需要记录日志的包-->

<loggername="org.springframework">

<levelvalue="WARN"/>

</logger>

<loggername="org.hibernate">

<levelvalue="WARN"/>

</logger>

<loggername="org.hibernate.SQL">

<levelvalue="WARN"/>

</logger>

<loggername="org.hibernate.cache">

<levelvalue="ERROR"/>

</logger>

<root>

<levelvalue="INFO"/>

<appender-refref="stdout"/>

<appender-refref="logfile"/>

</root>

</configuration>

使用slf4j+logback的优势:

支持按文件大小或基于时间的切分方式,可自定义命名模式

支持文件打包(触发器方式)

支持OSGI环境

如果在单纯的logging环境中,使用SLF4J意义不大。如果想在各种loggerAPI中切换,SELF4J是理想选择,另外在新的项目中,使用SLF4J+Logback是比较好的日志框架选型。

相关推荐