log4j2 核弹大锅,顺便学习SLF4J与log4j2
Posted 笑虾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j2 核弹大锅,顺便学习SLF4J与log4j2相关的知识,希望对你有一定的参考价值。
2021年12月10日 惊爆。
此漏洞只涉及log4j2,用1的可以先狗住别动。
至于版本,我推荐直接RELEASE
毕竟刚说完2.15,就升2.16,刚说完2.16就升2.17我总不能天天来改这帖子不是。。。
log4j2 核弹大锅
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
的依赖,如果不想用它默认的,可以手动添加,依照最短路径原则,系统会使用你提供的依赖。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.7.32</version>
</dependency>
绑定 jul
- 它会引用
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)
以上是关于log4j2 核弹大锅,顺便学习SLF4J与log4j2的主要内容,如果未能解决你的问题,请参考以下文章
终于!Spring Boot 最新版发布,一招解决 Log4j2 核弹级漏洞!
Java 学习笔记 - 日志体系 SLF4J + Log4j2
Java 学习笔记 - 日志体系 SLF4J + Log4j2