作为一名 Java 程序员,日常开发工作中肯定会接触日志系统,但是众多的框架,包括 Log4j、Log4j2、Logback、Slf4j、Apache Common logging 等等,引用的 maven 依赖众多,到底可以去掉哪些,一行 LoggerFactory.getLogger(LogbackTest.class) 后做了哪些工作,怎么去找的配置文件,这些还是有很多细节可以去研究的。

一、困扰的疑惑

目前的日志框架有 jdk 自带的 logging,log4j1、log4j2、logback ,这些框架都自己定制了日志 API ,并且有相应的实现;目前用于实现日志统一的框架 Apache commons-logging、slf4j ,遵循「面向接口编程」的原则,这两大框架可以让用户在程序运行期间去选择具体的日志实现系统(log4j1\log4j2\logback等)来记录日志,是统一抽象出来的一些接口。

这些日志系统涉及到的繁杂的各种集成 jar 包,如下:

  • log4j、log4j-api、log4j-core
  • log4j-1.2-api、log4j-jcl、log4j-slf4j-impl、log4j-jul
  • logback-core、logback-classic、logback-access
  • commons-logging
  • slf4j-api、slf4j-log4j12、slf4j-simple、jcl-over-slf4j、slf4j-jdk14、log4j-over-slf4j、slf4j-jcl

log4j Apache 的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等;用户也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,用户能够更加细致地控制日志的生成过程。这些可以通过一个 配置文件来灵活地进行配置,而不需要修改程序代码。最新的目前版本为log4j 1.2,maven 依赖如下:

  1. <dependency>
  2. <groupId>log4j</groupId>
  3. <artifactId>log4j</artifactId>
  4. <version>1.2.17</version>
  5. </dependency>

Logback Logback 是由 log4j 创始人设计的又一个开源日记组件,Logback 当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块,logback-classic是log4j的一个 改良版本。此外logback-classic 完整实现 SLF4J API 使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日记的功能。maven 最新依赖如下:

  1. <dependency>
  2. <groupId>ch.qos.logback</groupId>
  3. <artifactId>logback-core</artifactId>
  4. <version>1.1.6</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>ch.qos.logback</groupId>
  8. <artifactId>logback-classic</artifactId>
  9. <version>1.1.6</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.slf4j</groupId>
  13. <artifactId>slf4j-api</artifactId>
  14. <version>1.7.18</version>
  15. </dependency>

更快的执行速度Logback 作为一个通用可靠、快速灵活的日志框架,将作为 Log4j 的替代和 SLF4J 组成新的日志系统的完整实现。Logback 声称具有极佳的性能,“ 某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LogBack中需要3纳秒,而在Log4J中则需要30纳秒。 LogBack 创建记录器(logger)的速度也更快:13微秒,而在Log4J中需要23微秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的”。另外,Logback的所有文档是全面免费提供的,不象Log4J那样只提供部分免费文档而需要用户去购买付费文档。具体包括:

  • 更充分的测试
  • logback-classic 非常自然的实现了SLF4J
  • 使用XML配置文件或者Groovy
  • 自动重新载入配置文件
  • 优雅地从I/O错误中恢复
  • 自动清除旧的日志归档文件
  • 自动压缩归档日志文件
  • 谨慎模式
  • Lilith
  • 配置文件中的条件处理
  • 更丰富的过滤
  • Logback-access模块,提供了通过HTTP访问日志的能力,是logback不可或缺的组成部分

详细的介绍可以参考:http://www.oschina.net/translate/reasons-to-prefer-logbak-over-log4j

越来越多的开源项目依赖 Logback:

SLF4J 简单日记门面(Facade) SLF4J 是为各种 loging APIs 提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。

Apache Common-Logging 目前广泛使用的Java日志门面库。通过动态查找的机制,在程序运行时自动找出真正使用的日志库。但由于它使用了ClassLoader寻找和载入底层的日志库, 导致了象OSGI这样的框架无法正常工作,由于其不同的插件使用自己的ClassLoader。 OSGI的这种机制保证了插件互相独立,然而确使Apache Common-Logging无法工作。

SLF4J 库类似于 Apache Common-Logging。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合,如此便可以在OSGI中使用了。另外,SLF4J 支持参数化的log字符串,避免了之前为了减少字符串拼接的性能损耗而不得不写的if(logger.isDebugEnable()),现在你可以直接写:logger.debug(“current user is: {}”, user)。拼装消息被推迟到了它能够确定是不是要显示这条消息的时候,但是获取参数的代价并没有幸免。同时,日志中的参数若超过三个,则需要将参数以数组的形式传入,如:

  1. Object[] params = {value1, value2, value3};
  2. logger.debug(“first value: {}, second value: {} and third value: {}.”, params);

二、how to use

现在,Hibernate、Jetty、Spring-OSGi、Wicket和MINA等越来越多的开源项目都已经迁移到了SLF4J,由此可见SLF4J的影响力不可忽视。

介绍完这些日志框架后,那么这些东西怎么用,之间的依赖是什么样子的,还有启动初始化的过程究竟干了什么,怎么找到相应的实现类及配置的?

这四篇文章是我目前在互联网上面发现的写的最详细的介绍,请参考:

  1. jdk-logging、log4j、logback日志介绍及原理 三个日志系统的实现机制介绍
  2. commons-logging与jdk-logging、log4j1、log4j2、logback的集成原理 Apache Commons-logging 通用日志框架与日志系统的机制介绍
  3. SLF4J 与 jdk-logging、log4j1、log4j2、logback的集成原理 SLF4J 通用日志框架与具体日志实现系统的机制机制介绍,包括依赖的jar包,jar冲突处理等;
  4. slf4j、jcl、jul、log4j1、log4j2、logback大总结 各个组件的jar包以及目前系统日志需要切换实现方式的方法,推荐阅读。
  1. <!-- ================================================= -->
  2. <!-- 日志及相关依赖(用slf4j+logback代替jcl+log4j) -->
  3. <!-- ================================================= -->
  4. <dependency>
  5. <groupId>org.slf4j</groupId>
  6. <artifactId>slf4j-api</artifactId>
  7. <version>1.7.7</version>
  8. </dependency>
  9. <!-- 强制使用 logback的绑定 -->
  10. <dependency>
  11. <groupId>ch.qos.logback</groupId>
  12. <artifactId>logback-core</artifactId>
  13. <version>1.1.3</version>
  14. </dependency>
  15. <dependency>
  16. <groupId>ch.qos.logback</groupId>
  17. <artifactId>logback-classic</artifactId>
  18. <version>1.1.3</version>
  19. </dependency>
  20. <!-- 强制使用 logback的绑定,这里去除对log4j 的绑定 -->
  21. <dependency>
  22. <groupId>org.slf4j</groupId>
  23. <artifactId>slf4j-log4j12</artifactId>
  24. <version>99.0-does-not-exist</version>
  25. </dependency>
  26. <!-- slf4j 的桥接器,将第三方类库对 log4j 的调用 delegate 到 slf api 上 -->
  27. <!-- 这个桥接器是自己做的,主要是我们依赖的类库存在很多硬编码的引用 -->
  28. <dependency>
  29. <groupId>org.slf4j</groupId>
  30. <artifactId>log4j-over-slf4j</artifactId>
  31. <version>1.7.14-SNAPSHOT</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.slf4j</groupId>
  35. <artifactId>jcl-over-slf4j</artifactId>
  36. <version>1.7.7</version>
  37. </dependency>
  38. <!-- 强制排除 log4j 的依赖,全部 delegate 到 log4j-over-slf4j 上 -->
  39. <dependency>
  40. <groupId>log4j</groupId>
  41. <artifactId>log4j</artifactId>
  42. <version>99.0-does-not-exist</version>
  43. </dependency>
  44. <dependency>
  45. <groupId>apache-log4j</groupId>
  46. <artifactId>log4j</artifactId>
  47. <version>999-not-exist</version>
  48. </dependency>
  49. <!-- slf logback 配置结束 -->

三、结束

通过上述阅读,对「混乱的 java 日志体系」应该有了较清楚的理解,但是真的存在项目需要切换日志系统的情况吗?根据我的理解,很多当你的系统越来越庞大,越来越复杂需要系统重构,解决性能的时候,可以考虑升级你当前的日志配置。如果你是新启用的项目,直接考虑使用Logback + SLF4j 即可。

参考资料

参考:

http://www.ixirong.com/2016/03/13/intro-to-java-log/(以上内容转自此篇文章)

Java混乱的日志体系(logback)(转)的更多相关文章

  1. 记一个日志冲突——管中窥豹[java混乱的日志体系]

    D:\Java\jdk1.8.0_211\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Communit ...

  2. Java日志体系居然这么复杂?——架构篇

    本文是一个系列,欢迎关注 日志到底是何方神圣?为什么要使用日志框架? 想必大家都有过使用System.out来进行输出调试,开发开发环境下这样做当然很方便,但是线上这样做就有麻烦了: 系统一直运行,输 ...

  3. 【原创】架构师必备,带你弄清混乱的JAVA日志体系!

    引言 还在为弄不清commons-logging-xx.jar.log4j-xx.jar.sl4j-api-xx.jar等日志框架之间复杂的关系而感到烦恼吗? 还在为如何统一系统的日志输出而感到不知所 ...

  4. 混乱的 Java 日志体系

    混乱的 Java 日志体系 2016/09/10 | 分类: 基础技术 | 0 条评论 | 标签: LOG 分享到: 原文出处: xirong 一.困扰的疑惑 目前的日志框架有 jdk 自带的 log ...

  5. 架构师必备,带你弄清混乱的JAVA日志体系!

    作者:孤独烟 出处:http://rjzheng.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任 ...

  6. java日志体系的思考(转)

    Java 日志缓存机制的实现 Java 日志管理最佳实践 混乱的 Java 日志体系 log日志远程统一记录 浅谈后端日志系统 Java异常处理和接口约定 用SLF4j/Logback打印日志-1 用 ...

  7. java 日志体系目录

    java 日志体系目录 1.1 java 日志体系(一)log4j1.log4j2.logback.jul.jcl.slf4j 1.2 java 日志体系(二)jcl 和 slf4j 2.1 java ...

  8. java 日志体系(四)log4j 源码分析

    java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一. ...

  9. Java 日志体系(二)jcl 和 slf4j

    Java 日志体系(二)jcl 和 slf4j <java 日志体系(一)统一日志>:https://www.cnblogs.com/binarylei/p/9828166.html &l ...

随机推荐

  1. GCC 7.3 for Windows

    GCC 6.1x Compilers 下载地址1: Mingw gcc 6.30下载 这个是某微软员工编译的版本 MinGW is a port of GCC to Windows. It is fr ...

  2. HDU 4747 Mex ( 线段树好题 + 思路 )

    参考:http://www.cnblogs.com/oyking/p/3323306.html 相当不错的思路,膜拜之~ 个人理解改日补充. #include <cstdio> #incl ...

  3. 【python基础】--常用数据结构

    list tuple dict set四种常用数据结构 list list 有序的集合,可以随时添加.删除其中元素值; 支持list嵌套模式, >>> p = ['a','b']&g ...

  4. 关于jdk与jre的区别

    JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程 ...

  5. PTA 11-散列3 QQ帐户的申请与登陆 (25分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/723 5-15 QQ帐户的申请与登陆   (25分) 实现QQ新帐户申请和老帐户登陆的简 ...

  6. 201621123034 《Java程序设计》第11周学习总结

    作业11-多线程 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread ...

  7. Vue.js入门(一)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta htt ...

  8. table纵横都需要下拉框

    table 溢出,下拉框显示不全 <div class="table-scrollable"style="height: 500px; overflow-y: vi ...

  9. [洛谷P2801]教主的魔法

    题目大意:有$n$个数,$q$个操作.两种操作: $M\;l\;r\;w:$把$[l,r]$所有数加上$w$ $A\;l\;r\;c:$查询$[l,r]$内大于等于$c$的元素的个数. 题解:分块,对 ...

  10. bzoj 4621 Tc605 思想+dp

    4621: Tc605 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 328  Solved: 183[Submit][Status][Discuss ...