博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java日志框架
阅读量:6947 次
发布时间:2019-06-27

本文共 3994 字,大约阅读时间需要 13 分钟。

hot3.png

java很火,日志记录又是必需,因此就有了大量的日志记录框架,在日常使用时因为日志框架冲突引发各种问题,本文对之进行梳理,适合入门。由于作者水平限制,本文可能不够清晰甚至有错,烦请指出。在文章末尾的参考部分,有几位大牛总结的文章,推荐给大家。

下文将着重介绍上述日志框架的区别,以及避免不同框架组合引入时的冲突。

两个概念

日志系统

日志接口的具体实现。经典的有log4j,jdk自带的有java.util.Logging,还有log4j作者推出的被高度评价的logBack等等。

日志接口(门面)

如果只存在一种日志系统,日志接口完全没有必要存在(logBack无法独立使用)。但事与愿违,为了解决多个日志系统的兼容问题,日志接口应运而生。主流的日志接口有commons-logging和sl4j。

日志框架介绍

  • Log4j(Log for Java) Apache Log4j是一个基于Java的日志记录工具。它是由Ceki Gülcü首创的,现在则是Apache软件基金会的一个项目。
  • Log4j 2 Apache Log4j 2是apache开发的一款Log4j的升级产品,Log4j 2 不兼容Log4j。各个方面都与Logback非常相似。
  • Commons Logging Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging。
  • Slf4j(Simple Logging Facade for Java) 类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现。
  • Logback 一个“可靠、通用、快速而又灵活的Java日志框架”,属于(Slf4j阵营)
  • Jul(Java Util Logging) 自Java1.4以来的官方日志实现

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的发展趋势更好:

输入图片说明

Apache眼看有被Logback反超的势头,于2012-07重写了log4j 1.x,成立了新的项目Log4j 2。Log4j 2具有logback的所有特性。

框架对比

  • Commons Logging和Slf4j是日志门面,log4j和Logback则是具体的日志实现方案。
  • 比较常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用。

至此,你应该了解了它们之间的区别,下面就说说使用时jar包的引入,避免冲突

日志组件的桥接

如果你是Commons Logging系,那么最主流的组合Commons Logging + Log4j是你最好的选择。

Commons Logging + Log4j 需要引入的包

commons-logging
commons-logging
1.2
log4j
log4j
1.2.17

如果你是Slf4j系,Slf4j + Logback组合是你最佳的选择,当然也有人愿意用Slf4j + Slf4j-Log4j + Log4j。

Slf4j + Logback 需要引入的包

org.slf4j
slf4j-api
1.6.0
jar
compile
ch.qos.logback
logback-core
0.9.28
jar
ch.qos.logback
logback-classic
0.9.28
jar

Slf4j + Slf4j-Log4j + Log4j需要引入的包

org.slf4j
slf4j-api
1.7.12
org.slf4j
slf4j-log4j12
1.7.12
log4j
log4j
1.2.17

建议选好一个组合后,严格按照以上导包(包的版本自行选择),这样做将很大程度上的避免冲突。

**特别注意:**Logback和Slf4j-Log4j12互斥,如果项目中同时存在,会引发冲突。

输入图片说明

当然,Slf4j还有很多组合,可能也有项目用到,本文不再一一说明:

输入图片说明

在项目中选择日志框架

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

  1. Slf4j实现机制决定Slf4j限制较少,使用范围更广。由于Slf4j在编译期间,静态绑定本地的LOG库使得通用性要比Commons logging要好。

  2. Logback拥有更好的性能

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

  3. 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的开销,使用占位符号,代码也更为简洁

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

参考

转载于:https://my.oschina.net/u/2930289/blog/1542697

你可能感兴趣的文章
基础命令(2018-05-07)
查看>>
微信小程序之页面下拉刷新
查看>>
《构建之法》阅读笔记01
查看>>
poj 3621 二分+spfa
查看>>
跨域解决方案之HTML5 postMessage
查看>>
2018.10.23-dtoj-1751小P的牧场(pasture)
查看>>
Mac下配置Eclipse <转>
查看>>
杂项随记:gcc/objdump/section等
查看>>
webstrom的坑
查看>>
正则表达式
查看>>
对我影响最大的三位老师
查看>>
第三天
查看>>
关于《半反去雾算法》一文的四宗罪。
查看>>
深度学习与计算机视觉系列(1)_基础介绍
查看>>
网站高并发解决方案参照http://www.toplee.com/blog/71.html
查看>>
grid++报表使用时注意事项
查看>>
【leetcode】Find Largest Value in Each Tree Row
查看>>
Android创建和使用数据库
查看>>
25、Python之禅
查看>>
YOLOv3的Darknet在OpenCV3.4.1(bug)下编译出错填坑
查看>>