繁体   English   中英

Lombok @Log4j2 注释不适用于最新版本的 log4j (v2.15.0)

[英]Lombok @Log4j2 annotation doesn't work with latest version of log4j (v2.15.0)

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

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)

这是我的主要 class

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

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

这不应该是lombok问题。 你的升级方法应该有问题。

升级log4j版本的正确方法:

对于maven ,设置 log4j2.version 属性:

<properties>
    <log4j2.version>2.15.0</log4j2.version>
</properties>

对于gradle

ext['log4j2.version'] = '2.15.0'

为我工作。

详细信息: Log4J2 漏洞和 Spring 引导

更多详细信息: 为什么需要升级 log4j 版本

如果您的 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>

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

  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>

对我有用的是排除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 依赖项的唯一版本。

Our old project have the same problem with 2.15.0or 2.16.0,then we try 2.12.2 is ok,and this also fix the security vulnerability。 here the log4j site: https://logging.apache.org/log4j/2 。X/

减轻

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

在 2.16.0 版本中,Log4j 默认禁用对 JNDI 的访问。 现在需要显式启用配置中的 JNDI 查找。 Also, Log4j now limits the protocols by default to only java, ldap, and ldaps and limits the ldap protocols to only accessing Java primitive objects. 需要明确允许本地主机以外的主机。 邮件查找功能已完全删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM