注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

slf4j+logback快速上手指南  

2009-12-16 10:21:31|  分类: java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1、介绍:

SLF4J - 一个通用的日志门面库,为各种Logging API提供了一套通用的日志接口,更多信息请参考官方网站

SLF4J会根据classpath中所存在的适配器的jar来决定将使用的日志实现库。

若需要将使用了其它logging APIs的第三方类库或已有代码的日志调用迁移到SLF4J,需要替换下面的jar:

  • jcl-over-slf4j.jar     替换apache commons logging。
  • log4j-over-slf4j.jar   替换log4j。原有的log4j.properites将失效,需要转换为logback.xml,logback网站上有提供转换器:http://logback.qos.ch/translator/
  • jul-to-slf4j.jar    替换jdk logging。需要在程序开始时调用SLF4JBridgeHandler.install()来注册listener。

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的影响力不可忽视。

LogBack -  一个通用可靠、快速灵活的日志框架,更多信息请参考官方网站

LogBack 将作为Log4j的替代,和slf4j组成新的日志系统的完整实现。LogBack分为三个模块:logback-core、logback- classic和logback-access。logback-core是其它两个模块的基础;logback-classic是log4j的一个改良版本; logback-access与Servlet容器集成提供通过Http来访问日志的功能。

LogBack声称具有极佳的性能:

“ 某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LogBack中需要3纳秒,而在Log4J中则需要30纳秒。 LogBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的”。

2、快速上手:

所需jar:

slf4j-api-1.4.3.jar - 一定是要的,直接支持logback实现

jcl104-over-slf4j-1.4.3.jar - 使用common-loggin的接口,底层还是由SLF4J来决定哪种实现机制

slf4j-jcl-1.4.3.jar - 使用SLF4J的接口,底层由common-loggin实现(不能和jcl104-over-slf4j-1.4.3.jar同时使用)

slf4j-log4j12-1.4.3.jar - 使用SLF4J的接口,底层由log4j实现

logback-core.jar logback核心包

logback-classic.jar

实际上,我们只需要slf4j-api, logback-core,logback-classic三个jar包即可,请自行下载slf4j和logback的最新jar包。

同时删除原来的commons-logging.jar和log4j.jar

mport org.slf4j.Logger;

import org.slf4j.LoggerFactory;

public class Test {

  final Logger logger = LoggerFactory.getLogger(Test.class);

    public void logTest() {

      // 不再需要log.isDebugalbe(),代码更简洁

      logger.debug(”hello {}”, “amsz”);

      logger.info("hihi{}","hhhh");

      }

}

再看看logback.xml的配置:

<?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="com.hzg.core">

        <level value="WARN" />

    </logger>

    <logger name="com.hzg.test">

        <level value="INFO" />

    </logger>   

   

    <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>

3、总结:

使用slf4j+logback的优势:

  • 支持按文件大小或基于时间的切分方式,可自定义命名模式
  • 支持文件打包(触发器方式)
  • 支持OSGI环境
如果在单纯的logging环境中,使用SLF4J意义不大。如果想在各种logger API中切换,SELF4J是理想选择,另外在新的项目中,使用SLF4J+Logback是比较好的日志框架选型。
  评论这张
 
阅读(1845)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017