简介
对于Log4j2大家应该都不是很陌生,听说最多的应该是2021年年底出现的安全漏洞了,不过最让大家头痛的应该不仅仅是这个安全漏洞的处理,安全漏洞通过升级最新的依赖版本即可快速解决,平时在使用过程中遇到过比较多的问题应该就是日志jar包不知道如何选择?日志jar冲突引起的日志不打印问题,日志配置太过复杂不知道如何配置只能百度CV粘贴一个配置。这些日志配置其实并不复杂,主要是因为日志组件的发展历史比较充满曲折,导致了很多地方不兼容。接下来就来通过日志组件的发展历史来入手,看看Log4j2是从什么背景下产生的。
Log4j2日志出现的这些问题多少与它出现的历史有点关系,接下来就先来了解下Java日志发展史,方便我们后续知道引入哪个依赖组件。
对于Java日志打印最开始只有大家熟悉的以System开头如System.out.println("hello world")这样的写法,默认的控制台日志打印方式需要有IO操作,性能极其低效(慎用),功能也太过单一只能简简单单的输出日志。
再后来就有了软件开发者Ceki Gulcu设计出了一套日志库也就是log4j并捐献给了Apache帮助简化日志打印。相关的依赖包是log4j和适配log4j2的桥接包log4j-1.2-api。
Java毕竟还是sun公司(后被oracle收购)的Java,sun公司并没有采纳Log4j提供的标准库,而是在jdk1.4自立一套日志标准JUL(Java Util Logging) JUL并不算强大也没得到普及所以现在大家也很少听说了。相关的依赖是jdk和适配log4j2的桥接包log4j-jul
为了方便开发者进行选择使用,Apache推出了日志门面JCL(Jakarta Commons Logging)可以在运行时绑定日志组件。 相关的依赖是commons-logging和适配log4j2的桥接包log4j-jcl。
前面的竞争促进了日志组件的发展但也逐渐导致日志依赖与配置越来越复杂,2006年Log4j的作者Ceki Gulcu离开了Apache组织后觉得JCL门面不好用,于是自己开发了一版和其功能相似的Slf4j(Simple Logging Facade for Java)这个也是大家所熟悉的日志门面。相关的依赖是slf4j-api和适配log4j2的桥接包og4j-slf4j-impl或者log4j-slf4j2-impl。
后来Slf4j作者又写出了Logback日志标准库作为Slf4j接口的默认实现。
到了2012年,Apache可能看到这样下去要被反超了,于是就推出了新项目Log4j2并且不兼容Log4j,全面借鉴Slf4j+Logback。Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了显著的改进,并提供了Logback中可用的许多改进,同时修复了Logback体系结构中的一些固有问题。