背景
Java 用第三方开源包,免不了被漏洞追着跑,几乎每年都要对最新爆出的漏洞组件进行升级,今年要升级的是 log4j2 和 nacos,升级到最新版本。
本文介绍 log4j2 升级到最新版本 2.23.1 的过程。
整理了一份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记的【点击此处即可】即可免费获取
依赖包
log4j2 其实用法很简单,涉及到的 jar 包只有 5 个:
- log4j-1.2-api-2.23.1.jar
- log4j-api-2.23.1.jar
- log4j-core-2.23.1.jar
- log4j-slf4j-impl-2.23.1.jar
- 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#noProviders for further details. SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier. SLF4J: Ignoring binding found at [jar:file:/home/ultrasafe-SmartCollector-1.2/lib/commonlib/log4j-slf4j-impl-2.23.1.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
门面包版本包不匹配时,日志直接被忽略了,别问我怎么知道的,这是我画蛇添足把这个包升级到 2.0.5 后得出的教训。
log4j2 的配置环境变量引用方法
额外补充一下我在将某项目从 log4j 升级到 log4j2 的过程中碰到的一个小问题,log4j.properties 中引用环境变量的方法是 ${系统变量}
,但是对于 log4j2.xml 配置文件中,这个方式不生效了,而是用 ${sys:系统变量}
方式引用系统变量。
启示录
log4j2 只要5个包,升级后其他 log4j 的 jar 可以删除了。升级过程除了自作聪明对门面升级而调坑外,比我想象的顺利多了。去掉了 log4j 后,至少可以消停一段时间了。