这两天沸沸扬扬的 Log4j2 漏洞门事件炒得热火朝天:

 ​

如果你使用的是 Log4j 1.x、Logback 或者其他日志框架,这次就可以幸免于难。

Log4j 1.x 就不用说了,这是老古董了,也就是传说中的老牌日志框架 "Log4j",曾经无处不在,现在很少用到了,除非在一些老系统中,新项目基本都是 Log4j 2.x 和 Logback 了。

Log4j 2.x 就是对 Log4j 1.x 的升级,得到了重大改进,并且吸引了 Logback 中的优秀设计并加以优化,现在得比较多。

Logback 同样也是 Log4j 的作者开发的,拥有更多丰富的特性,是 Log4j 1.x 的替代。

Log4j 2.x 用得比较多,一是因为它是 Apache 顶级项目,二是因为它牛逼的异步日志记录性能:

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过!!_日志框架

更多性能对比参考:

 ​


可以看到,同样都是异步模式,当线程不断增多时,Log4j 2.x 的性能吊打 Log4j 1.x 和 Logback,Logback 和 Log4j 则不相上下。

单从性能来说,Log4j 2.x 无疑是日志框架中的王者,但 Logback 也不甘下风,它凭借作为 Spring Boot 中的默认日志框架,Logback 也得到大量应用。

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过!!_spring_02

如图,如果我们没有指定任何其他日志 Starter,默认的就是 Logback。

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过!!_java_03

它是从 Spring Boot 默认依赖中带出来的,更多可以看栈长在公众号Java技术栈分享过的 


很多粉丝说用的 Logback,没有躺枪,可能也是因为使用了 Spring Boot 默认的日志配置吧,Spring Boot 机智了一回?


为什么 Logback 能成为 Spring Boot 的默认日志框架?

个人认为,主要原因是由于 Logback 是原生 SLF4J API(目前最主流的日志门面接口) 的实现,可以很轻松的切换到其他日志框架,而 Log4j 并非原生实现,它们结合 SLF4J API 都需要一个中间适配层。

这个可在参考一张国外的图:

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过!!_日志框架_04


 

SLF4J 接口的直接原生实现是 Logback,但也可以通过中间适配层连接 Log4j 等其他非原生实现的日志框架,你看明白了吗?

Log4j 2.x vs Logback 怎么选?

从上面的性能图来看,Log4j 在并发写到达 4 个线程/秒及以上,性能就开始碾压 Logback 了。

所以,如果日志量很大,对性能又有要求,那么 Log4j 2.x 无疑是首选,否则用啥都无所谓,即对日志记录没有性能要求,日志记录的快慢不会影响系统正常运行,毕竟 Logback 是 SLF4J 原生支持,一般的系统完全足够应对了。

漏洞是不可避免的,Linux、Tomcat 也经常爆严重漏洞,我们依然要用,反过来,Log4j 2.x 也是如此,不要因为一个框架出现漏洞就马上换其他框架,也许其他框架也有漏洞,只是没有爆出来而已。

不多说了,最后,栈长再通知一次,没修复的,尽快了:

 ​

好了,今天的分享就到这里了,后面栈长会分享更多好玩的 Java 技术和最新的技术资讯,关注公众号Java技术栈第一时间推送,我也将主流 Java 面试题和参考答案都整理好了,在公众号后台回复关键字 "面试" 进行刷题。