Log4J2 AppenderLoggingException NoSuchMethodError StackLocatorUtil.getCurrentStackTrace()

Log4J2 AppenderLoggingException NoSuchMethodError StackLocatorUtil.getCurrentStackTrace()

一旦 exception/error 发生并且应该被记录,我就会得到以下 error/stack 跟踪:

org.apache.logging.log4j.core.appender.AppenderLoggingException: java.lang.NoSuchMethodError: 'java.util.Deque org.apache.logging.log4j.util.StackLocatorUtil.getCurrentStackTrace()'
   at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:165)
   at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:134)
   at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:125)
   at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:89)
   at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:675)
   at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:633)
   at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:616)
   at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:552)
   at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:82)
   at org.apache.logging.log4j.core.Logger.log(Logger.java:161)
   at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2205)
   at org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(AbstractLogger.java:2159)
   at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2142)
   at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2017)
   at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1983)
   at org.apache.logging.log4j.spi.AbstractLogger.fatal(AbstractLogger.java:1063)

下一个at就是所谓的Logger#fatal/error(String,Throwable)

Java 11、Log4J 2.17.2(-core 和 -api),使用 Gradle 构建的项目。从 build.gradle 中删除 Multi-Release: true 似乎无法解决问题(仅添加了预期的 Reflection.getCallerClass() 警告)

我错过了什么?

看起来缺少的方法 'org.apache.logging.log4j.util.StackLocatorUtil.getCurrentStackTrace()' 在 log4j-api jar 中,由 log4j-core jar 中的 AppenderControl class 调用。

一个可能的问题可能是您在“compile classpath”上有两个 jar,但在“runtime classpath”上只有 log4j-core。确保您的 gradle 配置不使用 log4j-api 作为“仅编译”依赖项。

原来一个库有依赖项 Log4J-api 2.17.1(但不是 -core),我的 gradle 文件指定了 Log4J-core 2.17.2 所以旧的 -api 版本会覆盖最新版本。 显然,从 2.17.1 到 .2,StackLocatorUtil.getCurrentStackTrace() 的 return 从 Stack 更改为 Deque