面试知识点总结
1. 一篇文章说清 netty 的线程模型 2. 一篇说尽 java 线程池 3. 一篇就够了系列 - LinkedHashMap 4. 使用LinkedHashMap构建LRU的Cache 5. 并发编程之-Excutor框架 6. Java工具类提供的排序功能 7. Java的众多log库都是什么关系? 8. Java常用日志框架历史 9. 网页特殊符号(HTML字符实体)大全 10. JavaFX项目打包为独立的macOS应用程序和dmg文件 11. Java 11 支持的 基于 HTTP/2 的响应式请求 12. Java 11 中 HttpClient 的使用(HTTP/2协议) 13. Java 11 模块化入门教程 14. 五五面试网-带你 理解 java 模块系统 (一) 15. 五五面试网-带你 理解 java 模块系统 (二) 16. 五五面试网-带你 理解 java 模块系统 (三) 手动新建一个java模块 17. Java中的TreeMap 18. gradle:现代高效的java构建工具 19. Spring + MyBatis 框架下处理数据库异常 20. 通过开源项目,免费获取Idea的开源授权 21. IntelliJ IDEA 2020最新激活码(亲测有效,可激活至 2089 年)

Java的众多log库都是什么关系?

造一个自己认为最牛逼的轮子,或许是程序员最得意的事情了吧!比如log库

java生态有众多的log库,常见听说过的有 Log4j 1,Log4j 2,Commons Logging,Slf4j,Logback,Jul。那么他们之间有什么关系?或者全没有关系呢?

 

  1. 日志实现库和日志框架库

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,缩写Slf4j)。
Logback 实现库 一套日志组件的实现(Slf4j阵营)。
Jul 实现库 (Java Util Logging),自Java1.4以来的官方日志实现。

 


日志框架库,也叫『日志门面(Logging Facade )』,定义了一套日志接口(其内部也提供一个Simple Log的简单实现),支持运行时动态加载日志组件的实现,也就是说,在你应用代码里,只需调用日志框架库的接口,底层实现可以是Log4j,也可以是Java Util Logging。实现了业务逻辑和写日志和日志实现库的解耦。

日志实现库,是具体负责写日志到文件的库

 

 

Commons Logging和Slf4j是日志门面(门面模式是软件工程中常用的一种软件设计模式,也被称为正面模式、外观模式。它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用)。

Log4j和Logback则是具体的日志实现方案。可以简单的理解为接口与接口的实现,调用者只需要关注接口而无需关注具体的实现,做到解耦。 比较常用的组合使用方式是Slf4j与Logback组合使用,Commons Logging与Log4j组合使用。
 

  1. 项目中选择日志框架选择

如果是在一个新的项目中建议使用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把构建日志的开销放在了它确认需要显示这条日志之后,减少内存和Cup的开销,使用占位符号,代码也更为简洁

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