【问题标题】:Lombok @Log4j2 annotation doesn't work with latest version of log4j (v2.15.0)Lombok @Log4j2 注释不适用于最新版本的 log4j (v2.15.0)
【发布时间】:2022-01-15 14:19:02
【问题描述】:

我将 log4j 依赖升级到最新的 2.15.0 版本,现在我的 Spring Boot 应用程序在启动时抛出错误

Exception in thread "main" java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY
    at org.apache.logging.log4j.core.config.ConfigurationSource.<clinit>(ConfigurationSource.java:56)
    at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32)
    at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:85)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:254)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:136)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:123)
    at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:117)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:150)
    at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47)
    at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:581)
    at foo.bar.org.MyApp.<clinit>(MyApp.java:13)

这是我的主要课程

@Log4j2
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
public class MyApp {

  public static void main(String[] args) {
    SpringApplication.run(MyApp.class, args);
  }
}

【问题讨论】:

  • 你试过在这个类中使用这个日志来检查日志吗? log.info("anything");
  • 降级并与 Lombok 开发人员一起创建错误报告。
  • 我非常怀疑这与龙目岛有什么关系。 Lombok 只生成一个 LogManager.getLogger 调用。这听起来像是您在依赖项堆栈中混合了版本。运行java -jar lombok.jar delombok -p YourSourceFile.java 然后尝试编译它,这将为您确认lombok 不是这里的问题。或者只是检查文档 - @Log4j2 只是生成一个单行。
  • 您是如何升级到 Log4j 2.15.0 的?

标签: java spring-boot lombok


【解决方案1】:

我们老项目2.15.0或者2.16.0也有同样的问题,然后我们尝试2.12.2就ok了,这样也修复了安全漏洞。 这里是 log4j 站点:https://logging.apache.org/log4j/2.x/

缓解

在 2.12.2 版本中,Log4j 默认禁用对 JNDI 的访问。现在需要显式启用配置中 JNDI 的使用。对 JndiLookup 的调用现在将返回一个常量字符串。此外,Log4j 现在默认将协议限制为仅 java。邮件查找功能已完全删除。

在 2.16.0 版本中,Log4j 默认禁用对 JNDI 的访问。现在需要显式启用配置中的 JNDI 查找。此外,Log4j 现在默认将协议限制为仅 java、ldap 和 ldaps,并将 ldap 协议限制为仅访问 Java 原始对象。需要明确允许本地主机以外的主机。邮件查找功能已完全删除。

【讨论】:

    【解决方案2】:

    对我有用的是排除 log4j-apilog4j-core 冲突版本的所有传递依赖项。
    我已经通过以下方式追踪了他们:
    mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-api

    mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-core
    所以我确定 2.15.0 版本是唯一的版本对于整个项目的两个 log4j 依赖项。

    【讨论】:

      【解决方案3】:
      1. 设置 log4j2.version 属性:
      <properties>
          <log4j2.version>2.15.0</log4j2.version>
      </properties>
      
      1. 修复 pom.xml:
      <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-api</artifactId>
          <version>${log4j2.version}</version>
      </dependency>
      <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-core</artifactId>
          <version>${log4j2.version}</version>
      </dependency>
      

      【讨论】:

      • 感谢您的解决方案。它帮助了我
      【解决方案4】:

      如果您的 pom.xml 中有以下内容:

      <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>
      

      确保两者具有相同的版本。我忘记了一个(离开旧版本)并看到了同样的错误。

      【讨论】:

      • Sonarqube 问题已解决
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多