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
。
一旦 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
。