Log4j
Apache的一个开放源代码项目,经过使用Log4j,咱们能够控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也能够控制每一条日志的输出格式;经过定义每一条日志信息的级别,用户可以更加细致地控制日志的生成过程。这些能够经过一个 配置文件来灵活地进行配置,而不须要修改程序代码。
LOGBack
Logback是由log4j创始人设计的又一个开源日记组件。logback当前分红三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你能够很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供经过Http来访问日记的功能。
Log4J vs. 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是为各类loging APIs提供一个简单统一的接口,从而使得最终用户可以在部署的时候配置本身但愿的loging APIs实现。 Logging API实现既能够选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也能够经过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。
Apache Common-Logging
目前普遍使用的Java日志门面库。经过动态查找的机制,在程序运行时自动找出真正使用的日志库。但因为它使用了ClassLoader寻找和载入底层的日志库, 致使了象OSGI这样的框架没法正常工做,因为其不一样的插件使用本身的ClassLoader。 OSGI的这种机制保证了插件互相独立,然而确使Apache Common-Logging没法工做。
SLF4J vs. Apache Common-Logging
SLF4J库相似于Apache Common-Logging。可是,他在编译时静态绑定真正的Log库。使用SLF4J时,若是你须要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合。 如此即可以在OSGI中使用了。
另外,SLF4J 支持参数化的log字符串,避免了以前为了减小字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),如今你能够直接写:logger.debug(“current user is: {}”, user)。拼装消息被推迟到了它可以肯定是否是要显示这条消息的时候,可是获取参数的代价并无幸免。同时,日志中的参数若超过三个,则须要将参数以数组的形式传入,如:
Object[] params = {value1, value2, value3};
logger.debug(“first value: {}, second value: {} and third value: {}.”, params);
如今,Hibernate、Jetty、Spring-OSGi、Wicket和MINA等项目都已经迁移到了SLF4J,因而可知SLF4J的影响力不可忽视。
使用CommonLog接口而实际由SLF4J和Log4j实现的过程
一、项目中照常使用
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
编写日志。
二、仍然在src下使用log4j.properties文件进行配置。
三、使用的全部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下,导入项目中,就能够像以往同样继续使用Apache Common-Logging编写日志了。
看一看logback.xml的配置 java
<?xml version="1.0" encoding="UTF-8"?> <configuration> <substitutionProperty name="log.base" value="../logs/hzg" /> <jmxConfigurator /> <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </layout> </appender> <!-- 文件输出日志 (文件大小策略进行文件输出,超过指定大小对文件备份)--> <appender name="logfile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <Encoding>UTF-8</Encoding> <File>${log.base}.log</File> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <FileNamePattern>${log.base}.%d{yyyy-MM-dd}.log.zip</FileNamePattern> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>2MB</MaxFileSize> </triggeringPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>%date [%thread] %-5level %logger{80} - %msg%n</pattern> </layout> </appender> <!-- 须要记录日志的包 --> <logger name="org.springframework"> <level value="WARN" /> </logger> <logger name="org.hibernate"> <level value="WARN" /> </logger> <logger name="org.hibernate.SQL"> <level value="WARN" /> </logger> <logger name="org.hibernate.cache"> <level value="ERROR" /> </logger> <root> <level value="INFO" /> <appender-ref ref="stdout" /> <appender-ref ref="logfile" /> </root> </configuration>
使用slf4j+logback的优点:
支持按文件大小或基于时间的切分方式,可自定义命名模式
支持文件打包(触发器方式)
支持OSGI环境
若是在单纯的logging环境中,使用SLF4J意义不大。若是想在各类logger API中切换,SELF4J是理想选择,另外在新的项目中,使用SLF4J+Logback是比较好的日志框架选型。spring