(日志管理-2)slf4j+logback日志框架剖析

来源:互联网 发布:云计算安全问题解决 编辑:程序博客网 时间:2024/06/05 09:18

如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助

为什么选择slf4j+logback日志框架

如果是在一个新的项目中建议使用Slf4j与Logback组合,这样有如下的几个优点。

  • Slf4j实现机制决定Slf4j限制较少,使用范围更广。由于Slf4j在编译期间,静态绑定本地的LOG库使得通用性要比Commons logging要好。
  • Logback拥有更好的性能。Logback声称:某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在Logback中需要3纳秒,而在Log4J中则需要30纳秒。LogBack创建记录器(logger)的速度也更快:13毫秒,而在Log4J中需要23毫秒。更重要的是,它获取已存在的记录器只需94纳秒,而Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的。
  • Commons Logging开销更高 在使Commons Logging时为了减少构建日志信息的开销,通常的做法是:
if(log.isDebugEnabled()){    log.debug("User name: " + user.getName() + " buy goods id :" + good.getId());}

在Slf4j阵营,你只需这么做:

log.debug("User name:{} ,buy goods id :{}", user.getName(),good.getId());

也就是说,slf4j把构建日志的开销放在了它确认需要显示这条日志之后,减少内存和cpu的开销,使用占位符号,代码也更为简洁

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

使用slf4j+logback

选择jar包

这里写图片描述

分析jar包

logback主要由三个部分组成:logback-core、logback-classic、logback-access。

  • logback-core是其他模块的基础设施,其他模块基于它构建。
  • logback-classic时log4j的一个改进版,它完整实现了SLF4J。
  • logback-access主要作为一个与Servlet容器交互的模块,比如tomcat或者jetty,提供一些与HTTP访问相关的功能。

配置文件解析

自动重新加载

<?xml version="1.0" encoding="utf-8"?><configuration scan="true" scanPeriod="10 seconds">    ...</configuration>

appender

Appender是configuration的子节点,是负责写日志的组件。常用的Appder有三个:ConsoleAppender、FileAppende、RollingFileAppder,它们来自同一个超类OutputStreamAppender。RollingFileAppender需要搭配相应的滚动策略(rolliingPolicy)和触发策略(tripggringPolicy)使用。

<?xml version="1.0" encoding="utf-8"?><configuration scan="true" scanPeriod="10 seconds">    <!--控制台日志-->    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">        <encoder>            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>            <charset>UTF-8</charset>        </encoder>    </appender>    <root level="info">        <appender-ref ref="console"/>    </root></configuration>

代码应用测试

private final static Logger _logger = LoggerFactory.getLogger(CollectionHelper.class) ;/** * @description <p>处理的集合元素越多,去重速度更快,10万元素100毫秒,10个元素200毫秒</p> * @param list * @return * @returnType List<Object> * @author heshiyuan @date 2017年3月16日 下午7:37:53 * @path javase-common/com.javase.util/CollectionHelper.java * @date 2017年3月16日 下午7:37:53 * @price ¥:三毛三 * @copyright 如有复制粘贴请通知本人或者捐赠,微信号:hewei1109 * @email heshiyuan@chtwm.com * @callnumber 15910868535 */public static void duplicateRemoval(List<Integer> list) {    _logger.info("CollectionHelper.duplicateRemoval工具类去重开始!");    long startTime = System.currentTimeMillis() ;    try{        if(list == null) {            _logger.info("将要去重的list集合是空,请检查参数再行调用!");            long endTime = System.currentTimeMillis() ;            _logger.info("调用去重工具类耗时{}毫秒!",(endTime - startTime));            return ;        }        _logger.info("去重之前的集合是{}",list.toString());        list = list.parallelStream().distinct().collect(Collectors.toList()) ;        _logger.info("去重之后的集合是{}",list.toString());    }catch(Exception e){        _logger.error("调用去重工具类CollectionHelper.duplicateRemoval遇到异常,异常信息:{}",e.getMessage());        throw e ;    }finally{        long endTime = System.currentTimeMillis() ;        _logger.info("调用去重工具类耗时{}毫秒",(endTime - startTime));        _logger.info("CollectionHelper.duplicateRemoval工具类去重结束!");    }}

最后

由于logback别的方面本次没有用到,此博客会后续维护。。。

原创粉丝点击