log4j2 核弹大锅,顺便学习SLF4J与log4j2

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j2 核弹大锅,顺便学习SLF4J与log4j2相关的知识,希望对你有一定的参考价值。

2021年12月10日 惊爆。
此漏洞只涉及log4j2,用1的可以先狗住别动。
至于版本,我推荐直接RELEASE毕竟刚说完2.15,就升2.16,刚说完2.16就升2.17我总不能天天来改这帖子不是。。。

Spring 默认使用 jcl
SpringBoot 默认使用 logback

SpringBoot 方案

这样可以覆盖默认版本

	<properties>
		<log4j.version>RELEASE</log4j.version>
	</properties>

其它

	<properties>
		<log4j.version>RELEASE</log4j.version>
	</properties>
	<dependencies>
		<!-- 日志框架 -->
		<!-- slf4j 绑定到 log4j2  -->
		<!-- log4j-slf4j-impl 的版本应该是与 log4j2 同步的 -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j18-impl</artifactId>
			<version>$log4j.version</version>
		</dependency>
		<!-- 桥接 log4j 到 SLF4J,最终用 log4j2 输出。解决spring4.2.x 使用 log4j 的问题 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>log4j-over-slf4j</artifactId>
			<version>RELEASE</version>
		</dependency>
	</dependencies>

SLF4J 与各日志框架的关系

Simple Logging Facade for Java (SLF4J) 充当各种日志框架(例如 java.util.logging、logback、log4j)的简单外观或抽象(外观模式),允许最终用户在部署时插入所需的日志框架。(啥叫面向接口编程,这就是吧。)

  • 首先slf4j依赖。引入后,我们就可以…
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>2.0.0-alpha5</version>
</dependency>

官方 HelloWorld

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld 
  public static void main(String[] args) 
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  

到了具体部署时,我们再选择使用哪个日志框架,只需要引用一个依赖,就可以实现将SLF4J与目标日志框架进行绑定

绑定

绑定 log4j

  • 它会引用log4j的依赖,如果不想用它默认的,可以手动添加,依照最短路径原则,系统会使用你提供的依赖。
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>2.0.0-alpha5</version>
</dependency>

绑定 log4j2

  • log4j-slf4j-impl
  • log4j-slf4j18-impl 新版,与 SLF4J 1.8.x 或更高版本一起使用。
  • 它会引用log4j2的依赖,如果不想用它默认的,可以手动添加,依照最短路径原则,系统会使用你提供的依赖。
<dependency>
	<groupId>org.apache.logging.log4j</groupId>
	<artifactId>log4j-slf4j18-impl</artifactId>
	<version>$log4j.version</version>
</dependency>

绑定 logback

  • 它会引用logback的依赖,如果不想用它默认的,可以手动添加,依照最短路径原则,系统会使用你提供的依赖。
<dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
   <version>1.3.0-alpha10</version>
</dependency>

绑定 jcl

JCL:Apache Commons Logging

  • 它会引用jcl的依赖,如果不想用它默认的,可以手动添加,依照最短路径原则,系统会使用你提供的依赖。
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-jcl</artifactId>
   <version>1.7.32</version>
</dependency>

绑定 jul

java.util.logging

  • 它会引用jul的依赖,如果不想用它默认的,可以手动添加,依照最短路径原则,系统会使用你提供的依赖。
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-jdk14</artifactId>
   <version>2.0.0-alpha5</version>
</dependency>

桥接

场景:老项目使用的Spring4.2.x日志框架用的log4j,种种原因,其它一些工具框架使用的日志框架log4j2。现在我们统一使用log4j2输出日志。那么就可以通过桥接方案。

log4j 桥接到 slf4j

<!-- 桥接 log4j 到 SLF4J,最终用 log4j2 输出。解决spring4.2.x 使用 log4j 的问题 -->
<dependency>
	<groupId>org.slf4j</groupId>
	<artifactId>log4j-over-slf4j</artifactId>
	<version>RELEASE</version>
</dependency>

jcl 桥接到 slf4j

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jcl-over-slf4j</artifactId>
   <version>2.0.0-alpha5</version>
</dependency>

jul 桥接到 slf4j

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jul-to-slf4j</artifactId>
   <version>2.0.0-alpha5</version>
</dependency>

参考资料

https://github.com/apache/logging-log4j2/tags
Log4j 2 SLF4J Binding
Simple Logging Facade for Java (SLF4J)

JCL:Apache Commons Logging
JUL:java.util.logging

Log4j2的漏洞 java日志体系,也是该全面了解下了(续集4)- 鲁班大叔007

以上是关于log4j2 核弹大锅,顺便学习SLF4J与log4j2的主要内容,如果未能解决你的问题,请参考以下文章

终于!Spring Boot 最新版发布,一招解决 Log4j2 核弹级漏洞!

Java 学习笔记 - 日志体系 SLF4J + Log4j2

Java 学习笔记 - 日志体系 SLF4J + Log4j2

腾讯安全刚刚给出了Log4j2核弹级漏洞线上修复方案!紧急修复

Slf4j与log4j及log4j2的关系及使用方法

Log4j2与Slf4j的最佳实践