又被漏洞追着跑?log4j2升级到 2.23.1 操作流程

背景

Java 用第三方开源包,免不了被漏洞追着跑,几乎每年都要对最新爆出的漏洞组件进行升级,今年要升级的是 log4j2 和 nacos,升级到最新版本。

本文介绍 log4j2 升级到最新版本 2.23.1 的过程。

整理了一份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记的【点击此处即可】即可免费获取

依赖包

log4j2 其实用法很简单,涉及到的 jar 包只有 5 个:

  1. log4j-1.2-api-2.23.1.jar
  2. log4j-api-2.23.1.jar
  3. log4j-core-2.23.1.jar
  4. log4j-slf4j-impl-2.23.1.jar
  5. slf4j-api-1.7.x.jar

log4j2 使用的门面框架包 slf4j-api-1.7.x.jar ,这个很重要,不能盲目对这个包进行升级,否则会报下列警告:

 

bash

复制代码

SLF4J: No SLF4J providers were found. SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See https://www.slf4j.org/codes.html#no

<think>嗯,用户想了解如何将Log4j升级Log4j2,同时处理slf4j-log4j12的问题。首先,我需要明确这两个框架的关系和区别。Log4j 1.x已经过时,存在安全漏洞,比如之前的Log4Shell问题,所以升级Log4j2是必要的。但用户可能已经在项目中使用了SLF4J作为日志门面,通过slf4j-log4j12桥接器来连接Log4j 1.x。升级Log4j2后,桥接器需要更换,否则会出现兼容性问题。 首先,我得确认升级步骤。需要移除旧的Log4j 1.x依赖和slf4j-log4j12,然后添加Log4j2的核心依赖以及SLF4J到Log4j2的桥接器。用户可能使用Maven或Gradle,所以需要分别给出两种依赖配置的例子。同时,需要提醒用户检查是否有其他依赖间接引入了旧版本的Log4j,可能需要排除掉。 接下来是配置文件的转换。Log4j 1.x使用log4j.properties,而Log4j2支持XML、JSON、YAML等格式,最常见的是XML。需要指导用户如何将旧配置迁移到新的Log4j2配置,例如替换类名和调整参数。比如,原来的ConsoleAppender在Log4j2中变成了Console,并且布局模式也有所变化。 另外,代码层面的改动可能不大,因为SLF4J作为门面,接口不变。但需要确保所有地方都通过SLF4J获取Logger,而不是直接使用Log4j的类。如果有地方直接引用了Log4j 1.x的API,需要替换为Log4j2的,不过这种情况可能较少,特别是如果之前已经正确使用SLF4J的话。 还要注意桥接器的正确使用。Log4j2提供了log4j-slf4j-impl来桥接SLF4J到Log4j2,而原来的slf4j-log4j12必须被移除,否则会导致冲突。同时,可能需要引入Log4j2的API库,如果项目中有直接使用Log4j2的情况,但大部分情况下通过SLF4J调用的话,可能不需要。 测试也是关键步骤。升级后需要运行测试,确保日志输出正常,没有类找不到或者配置错误的问题。特别是在多模块项目中,依赖管理要仔细检查,避免旧版本的jar包被引入。 用户可能遇到的问题包括依赖冲突、配置错误、桥接器未正确配置等,需要给出排查建议,比如使用Maven的dependency:tree命令,或者检查日志初始化时的错误信息。此外,提醒用户注意Log4j2的异步日志功能,如果需要可以配置,但那是可选的高级步骤。 总结一下,回答需要分步骤:移除旧依赖、添加新依赖、转换配置文件、检查代码、测试和排查问题。同时要强调使用桥接器log4j-slf4j-impl替代原来的slf4j-log4j12,确保依赖干净,避免冲突。可能还需要提供配置示例和常见问题解决方法,帮助用户顺利完成迁移。</think>将Log4j 1.x升级Log4j2,同时处理`slf4j-log4j12`的适配问题,需要分步骤完成以下操作: --- ### 一、理解依赖关系 1. **Log4j 1.x**:已停止维护,存在安全风险(如CVE-2021-44228) 2. **Log4j2**:新一代日志框架,提供异步日志等增强功能 3. **slf4j-log4j12**:SLF4J与Log4j 1.x的桥接器,升级后需替换为Log4j2的桥接器 --- ### 二、具体升级步骤 #### 1. **移除旧依赖** 在Maven/Gradle配置中删除以下内容: ```xml <!-- 移除Log4j 1.x --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <!-- 移除SLF4J到Log4j1的桥接器 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.30</version> </dependency> ``` #### 2. **添加Log4j2依赖** ```xml <!-- Log4j2核心 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.1</version> <!-- 使用最新稳定版 --> </dependency> <!-- SLF4J到Log4j2的桥接器 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.23.1</version> </dependency> <!-- 可选:Log4j2 API --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.23.1</version> </dependency> ``` #### 3. **配置文件迁移 - **旧文件**:`log4j.properties` - **新文件**:`log4j2.xml`(推荐)或 `log4j2.properties` 示例XML配置: ```xml <?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration> ``` #### 4. **代码层调整 - **无需修改**:如果代码通过SLF4J API记录日志(如`LoggerFactory.getLogger()`) - **必须修改**:若直接调用Log4j 1.x的API(如`org.apache.log4j.Logger`),需改为SLF4J API --- ### 三、关键注意事项 1. **依赖冲突检查** ```bash # Maven检查依赖树 mvn dependency:tree -Dincludes=org.apache.logging.log4j,org.slf4j ``` 2. **桥接器选择** - 使用`log4j-slf4j-impl`替代`slf4j-log4j12` - 确保**没有多个SLF4J绑定**(如同时存在logback-classic) 3. **日志初始化** - 删除旧版`log4j.properties` - Log4j2会自动加载`log4j2.xml`(放置在`src/main/resources`) --- ### 四、常见问题解决 1. **No SLF4J providers found** - 原因:缺少`log4j-slf4j-impl` - 方案:检查是否遗漏桥接器依赖 2. **日志不输出** - 检查配置文件语法(可用`status="TRACE"`开启内部日志) - 确认配置文件路径正确 3. **类加载冲突** - 排除旧版Log4j残留依赖: ```xml <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> ``` --- ### 五、扩展建议 - 启用Log4j2的**异步日志**提升性能: ```xml <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.23.1</version> </dependency> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.4.4</version> </dependency> ``` - 在配置中添加`<AsyncRoot>/<AsyncLogger>`标签 按此流程操作后,您的日志系统将迁移到Log4j2并保持与SLF4J的兼容性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值