Java日志

Java常用日志框架历史

  • 1996年早期,欧洲安全电子市场项目组决定编写它自己的程序跟踪API(Tracing API)。经过不断的改善,这个API终于成为一个十分受欢迎的Java日志软件包,即Log4j。后来,Log4j成为Apache基金会项目中的一员。
  • 期间Log4j近乎成了Java社区的日志标准。据说Apache基金会还曾经建议Sun引入Log4j到Java的标准库中,但被Sun拒绝了。
  • 2002年Java1.4发布,Sun推出了自己的日志库JUL(Java Util Logging),其实现基本模仿了Log4j的实现。在JUL问世以来,Log4j就已经成为一项成熟的技术,使得Log4j在选择上占据了一定的优势。
  • 接着,Apache推出了Jakarta Commons Logging,JCL只是定义了一套日志接口(其内部也提供一个Simple Log的简单实现),支持运动时动态加载日志组件的实现,也就是说,在你应用代码里,只需调用Commons Logging的接口,底层实现可以是Log4j,也可以是Java Util Logging。
  • 后来(2006年),Ceki Gülcü不适应Apache的工作方式,离开了Apache。然后先后创建了Slf4j(日志门面接口,类似于Commons Logging)和Logback(Slf4j的实现)两个项目,并回瑞典创建了QOS公司,QOS官网上是这样描述Logback的:The Generic, Reliable Fast&Flexible Logging Framework(一个通用,可靠,快速且灵活的日志框架)。
  • 现今,Java日志领域被划分为两大阵营:Commons Logging阵营和Slf4j阵营。Commons Logging在Apache大树的笼罩下,有很大的用户基数。但有数据表明,形式正在发生变化。2013年底,有人分析了GitHub上30000个项目,统计出了最流行的100个Libraries,可以看出Slf4j的发展趋势更好java_populor_jar
  • Apache眼看着有被Logback反超的势头,与2012-07重写了Log4j 1.x,成立了新项目Log4j 2,Log4j 2具有Logback的所有特性。

Java常用日志框架类别

  • Log4j    Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。Log4j是几种Java日志框架之一
  • Log4j 2    Apache Log4j 2是Apache开发的一款Log4j的升级产品。
  • Commons Logging    Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。
  • Slf4j    类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现(Simple Logging Facade for Java)。
  • Logback    一套日志组件的实现(Slf4j阵营)。
  • JUL    Java Util Logging,自Java1.4以来的官方日志实现。

Java常用日志框架关系

  • Log4j 2与Log4j 1发生了很大的变化,Log4j 2不兼容Log4j 1。
  • Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用)。Log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口是实现,调用者只需要关注接口而无需关注具体的实现,做到解耦。
  • 比较常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用。
  • Logback必须配合Slf4j使用。由于Logback和Slf4j是同一个作者,其兼容性不言而喻。

Commons Logging与Slf4j实现机制对比

Commons Logging实现机制

  • Commons Logging是通过动态查找机制,在程序运行时,使用资金的ClassLoader寻找和载入本地具体的实现。详细策略可以查看commons-logging-*.jar包中的org.apache.commons.logging.impl.LogFactoryImpl.java文件。
  • 由于Osgi不同的插件使用独立的ClassLoader,Osgi的这种机制保证了插件互相独立,其机制限制了Commons Logging在Osgi中的正常使用。

Slf4j实现机制

  • Slf4j在编译期间,静态绑定本地的Log库,因此可以在Osgi中正常使用。它是通过查找类路径下org.slf4j.impl.StaticLoggerBinder,然后再StaticLoggerBinder中进行绑定。

项目中选择日志框架

如果是在一个新的项目中,建议使用Slf4j与Logback组合。理由如下:

  • Slf4j实现机制决定Slf4j限制较少,使用范围更广。由于Slf4j在编译期间,静态绑定本地的LOG库使得通用性要比Commons Logging要好。
  • Logback拥有更好的性能。Logback声称:某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在Logback中需要3纳秒,而在Log4j中则需要30纳秒。Logback创建记录器(logger)的速度也更快:13毫秒,而在Log4j中则需要23毫秒。更重要的是,Logback获取已存在的记录器只需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把构建日志的开销放在了它确认需要显示这条日志之后,减少内存和Cup的开销,使用占位符号,代码也更为简洁
  • Logback文档免费。Logback的所有文档是全面免费提供的,不像Log4j那样只提供部分免费文档而需要用户去购买付费文档。

转载于:https://www.cnblogs.com/HNewa/p/Java_Logging.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值