简介
slf4j(simple logging Facade for java)是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。(门面模式)
LOGBack,一个“可靠、通用、快速而又灵活的Java日志框架”。
它完全可以替代apache commons logging + log4j组合,并且在性能和架构方面有了不小的改进。
1. 调用slf4j的接口,使用log4j,java.util.logging等log框架
代码中是要调用slf4j的方法来写log,基本上没有学习曲线,因为slf4j的接口和log4j等框架的接口是非常类似的。无非就是LogFactory和Log的使用而已。
而jar包之间的调用关系如图一所示:
图一:slf4j常规用法的jar文件之间的调用关系
2. 当前使用的是apache common logging + log4j组合,想不修改代码切换到slf4j + logback
代码不需要做任何修改,只要把apache common logging和log4j的jar包拿掉,增加slf4j和logback的jar,并把log4j的配置文件转换为logback的配置文件即可。
具体的jar包之间的调用关系,如图二所示:
图二:commong logging + log4j切换为slf4j的jar文件之间的调用关系
简单总结
个人看法,slf4j确实是一个非常优秀的框架,但是我们在选择的时候也要先考虑考虑。
★ 如果是写新的极小的系统,基本上不会有切换log系统的必要性,直接使用java.util.logging的接口就可以,方便快捷,配置简单。
★ 如果是写新的大型系统的话,应该考虑使用slf4j。
★ 如果是OSGi系统的话,slf4j是必选的。
★ 如果是维护现有系统的话,根据实际情况,确实有必要的话(比如说现有系统性能方面不佳;或者说系统中存在多种log系统,想要整合等),就要替换为slf4j。反之,则不需要替换,等以后真的有需求再替换也很简单的。
下面例子是一个使用logback按照每天生成log文件到tomcat目录下、、、
生成的时候之需要从LoggerFactory里面取得logger对象进行配置
private static final Logger LOG = LoggerFactory.getLogger("interfaceLogger");
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration>
<configuration>
<contextName>loginterface</contextName>
<!--配置环境变量设置相对路径-->
<property name="LOG_HOME" value="${catalina.base}/logs/loginterface"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<Encoding>UTF-8</Encoding>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/loginterface.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>31</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} -%msg%n
</Pattern>
</layout>
</appender>
<!--这里指定logger name 是为jmx设置日志级别做铺垫 -->
<logger name="interfaceLogger">
<level value="INFO"/>
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
优点
现如今,稍微有一点点规模的软件,都会使用日志。日志可以用来监控代码中变量变化,跟踪代码运行的轨迹,在开发环境中担当调试器作用,向控制台或文件输出信息。而apache common logging + log4j的组合,在slf4j出现之前,是业界最流行的log框架组合。但是自从slf4j+LOGBack的组合出现后,有一些著名的开源项目如,Apache的某些项目,Hibernate等都已经转向了slf4j + LOGBack的组合。
它们这样的选择,也印证了slf4j + LOGBack组合的优越性。这对组合大致有以下一些优点:
1. 支持更多的log框架
同样作为log门面,apache common logging框架主要是提供在log4j和java.util.logging之间的切换,而slf4j则可以支持更多的log框架,而且即便未来有了新的log框架,也可以通过写几个简单的类就全部切换过去
2. 更佳的性能
某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LOGBack中需要3纳秒,而在Log4J中则需要30纳秒。LOGBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的”。
3. 支持参数化配置
避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug("current user is: {}", user)。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。
4. 其他的一些优点
支持OSGi,LOGBack的配置文件可以条件化配置等。