`
daiyuok
  • 浏览: 25397 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

slf4j结合使用logback记录log错误日志文件

 
阅读更多

简介

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的配置文件可以条件化配置等。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics