avatar

一条在知识海洋的咸鱼

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

  • 首页
  • Linux
  • OCJP
  • Java核心技术卷
  • J2EE相关标准
  • 深入理解Java虚拟机
  • NIO与SOcket编程技术指南
  • Java多线程编程核心技术
  • Redis开发与运维
  • Spring Cloud Alibaba 微服务原理与实践
  • DevOps
  • Docker
  • MySQL必知必会
  • AI自学路线
  • Spring Boot 编程思想(核心篇)
主页 关于log4j BUG测试
文章

关于log4j BUG测试

发表于 2021-12-11 更新于 2026-06- 10
作者 Administrator
21~27 分钟 阅读

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

  • 运行环境
  • 更改JDK版本
    • 结果
    • 结论
  • 更改log4j依赖包
    • 结论
  • 集成springboot
    • springboot相关环境
    • 测试用例
    • 原因分析
  • 验证
  • 个人总结
    • 修复
    • 个人建议
  • 未完待续。。。

运行环境

更改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整合的日志框架可以避免

修复

  • 升级官方版本2.15
  • 其他还未测试,持怀疑态度,网上解决方案也并不可尽信
  • 特别注意修改全局参数配置要看log4j版本,官网留意更新
    log4j更新日志
    https://logging.apache.org/log4j/2.x/changes-report.html#a2.10.0
    2.10以上才支持全局参数配置

个人建议

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

未完待续。。。

低级BUG
许可协议: 
分享

相关文章

12月 11, 2021

关于log4j BUG测试

运行环境JDK3个版本maven依赖 &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt; &lt

12月 30, 2020

no available service 'default' found, please make sure registry config correct

背景技术架构springboot nacos seata dubbo产生原因在原项目上想对服务进行拆分,加入了其他分布式服务模块。后来发现拆分难度太大,耦合性太高。于是把自己添加的模块又给删除了,移除了父工程pom 相应的文件后启动报错,但是原本服务还是可以使用。所有服务均报错2020-12-30

12月 8, 2020

Mybtis There is no getter for property named "XXXX"报错

下一篇

J2EE概述

上一篇

NIO多路复用之Selector、SelectableChannel

最近更新

  • 55 异常兜底:工具失败、非法输出、空检索与超时
  • 54 Agent Memory:短期记忆、用户上下文与摘要
  • 53 Human-in-the-loop:让关键动作暂停、确认与恢复
  • 52 工单 Tool:字段校验、创建结果与失败补偿
  • 51 订单 Tool:Mock、鉴权、状态解析与脱敏

热门标签

java基础 微服务 maven Spring Tomcat DDD Linux Linux基础 SQL基础 数据结构算法

目录

©2026 一条在知识海洋的咸鱼. 保留部分权利。

使用 Halo 主题 Chirpy