(谢邀,刚用mvn dependency:purge-local-repository救回项目) 如果你问Java工程师最想删掉哪个依赖,99%的人会回答:“所有日志库”。这不是玩笑,而是用每秒6000次NoClassDefFoundError换来的血泪共识。

一、依赖绑架:开源社区的集体犯罪

打开任何Spring Boot项目的pom.xml,你会看到这样的恐怖片剧本:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId> <!-- 默认塞给你Logback -->
</dependency>
<!-- 但当你试图引入Log4j2时 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <exclusions>
        <!-- 必须手动肢解这个肿瘤 -->
        <exclusion>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-to-slf4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这不是技术选型,而是框架作者对开发者的系统性PUA:

  • Log4j 2.x的log4j-slf4j-impl与Logback的logback-classic必然同归于尽
  • JUL的java.util.logging永远在JDK里阴笑:“没想到吧?我还在!”
  • Commons Logging的jcl-over-slf4j像寄生虫般潜伏在Spring Core 更无耻的是,这些库的文档都写着“轻量级”“无侵入”,结果每个starter包都自带300KB以上的日志垃圾。

二、版本号恐怖主义:Maven中央仓库的垃圾场

某知名云厂商SDK的pom.xml曾出现这样的配置:

<dependency>
    <groupId>com.xxx</groupId>
    <artifactId>cloud-sdk</artifactId>
    <version>2.5.0</version>
    <exclusions>
        <!-- 被迫排除其强推的Log4j 1.x残骸 -->
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

这不是孤例,而是Java生态的日常恐怖:

  1. Hibernate 5.x默认捆绑jboss-logging,导致与SLF4J的战争
  2. Elasticsearch Java客户端强制绑定Log4j 2.x,无视你的Spring Boot配置
  3. Apache HttpClient悄悄引入Commons Logging,就像在披萨里塞死鱼 你如果在Stack Overflow搜索“SLF4J multiple bindings”,会看到127万条绝望的呐喊——这相当于全球Java工程师集体浪费了214人年的生命。

三、架构师的皇帝新衣:复杂度驱动的KPI

日志库的混乱本质是既得利益者的阴谋:

  • 面试官用“Log4j 2.x异步队列原理”过滤“不够资深的”求职者
  • 技术书籍靠“第8章:日志框架整合详解”多卖50页纸
  • 云厂商通过“日志采集兼容性认证”收取保护费 最讽刺的是,一个本应简单的需求被异化成这样:
// 人类想要的:
println("订单创建成功");
// Java生态给你的:
LoggerFactory.getLogger().info(
    MarkerFactory.getMarker("BIZ"),
    "{} {} [用户ID:{}] [TRACE_ID:{}]",
    Instant.now().toString(),
    Thread.currentThread().getName(),
    UserContextHolder.get(),
    MDC.get("traceId")
);

四、投降声明:我们已经不配拥有好工具

Python开发者已经用logging.basicConfig(level=INFO)开始工作了,Java工程师还在:

  1. 在IntelliJ里右击pom.xml选择"Show Dependencies"
  2. 对着一团乱麻的依赖图点击"Collapse All"
  3. 在控制台搜索"Caused by: java.lang.ClassNotFoundException: org.slf4j.impl.StaticLoggerBinder" 这不是技术演进,而是整个生态的尊严破产。

结语:

建议Oracle在JDK 21新增java.util.logging.nuke包,提供以下功能:

  • NukeLogger.detonateAllLoggingFrameworks(); // 一键清除所有第三方日志库
  • NukeLogger.setOutput(System.out); // 回归println原始美 如果这无法实现,至少请各大厂在招聘要求中写明: “熟悉SLF4J依赖排除术,颈椎病程度≥Ⅱ期者优先录用”

(完)

如需讨论,欢迎到知乎文章页面发表评论。