Log4j no such method error

Hello leaf-team,

I have setup a custom service-registry following the leaf-documentation. Due to project limitations, I had to build a 3.5 data service and upgrade to 3.6. See here

The issue is I am getting this error in the logs.

13:17:55.280 [qtp2005232837-42] e[32mINFO e[m c.l.f.l.LeafBaseDataServiceApplication - LEAF traceId=611032bb142e4bb8b10b863787ddaeaa, OpenTracing traceId=, OpenTracing spanId=, username=AnonymousSystemUser called IDataObjectService.loadByQuery with arguments (dataObjectQuery = DataObjectQuery [name=<Unnamed Query>, id=null]) which returned [Falc2onService (OpenskyService) {  }]
2022-11-01 13:17:55,810 qtp2005232837-43 ERROR An exception occurred processing Appender Console org.apache.logging.log4j.core.appender.AppenderLoggingException: java.lang.NoSuchMethodError: 'java.util.Stack 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:542)
	at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:500)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:483)
	at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417)
	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.error(AbstractLogger.java:750)
	at com.leidos.leaf.hooked.default_.hooks.LogHook.lambda$hookInvoker$2(LogHook.java:176)
	at com.leidos.leaf.hooked.IMethod.invoke(IMethod.java:125)
	at com.leidos.leaf.hooked.default_.hooks.TimeLimiterHook.lambda$hookInvoker$1(TimeLimiterHook.java:95)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeFromCallable.subscribeActual(MaybeFromCallable.java:47)
	at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5375)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeTimeoutMaybe.subscribeActual(MaybeTimeoutMaybe.java:50)
	at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5375)
	at io.reactivex.rxjava3.core.Maybe.blockingGet(Maybe.java:2859)
	at com.leidos.leaf.hooked.default_.hooks.TimeLimiterHook.lambda$hookInvoker$2(TimeLimiterHook.java:97)
	at com.leidos.leaf.hooked.BaseExtensibleService.invoke(BaseExtensibleService.java:129)
	at com.leidos.leaf.dataobject.service.DataObjectServiceExtensible.load(DataObjectServiceExtensible.java:888)
	at com.leidos.leaf.platform.servicediscovery.ServiceRegistry.loadRegisteredService(ServiceRegistry.java:132)
	at com.leidos.leaf.platform.servicediscovery.ServiceRegistry.registerService(ServiceRegistry.java:56)
	at com.leidos.leaf.platform.servicediscovery.rest.ServiceRegistryRestResource.registerService(ServiceRegistryRestResource.java:92)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:170)
	at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:130)
	at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:660)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:524)
	at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$2(ResourceMethodInvoker.java:474)
	at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:476)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:434)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:408)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:69)
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:492)
	at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:261)
	at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:161)
	at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:364)
	at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:164)
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:247)
	at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:249)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:60)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:799)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:550)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1434)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:501)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1349)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
	at org.eclipse.jetty.server.handler.gzip.GzipHandler.handle(GzipHandler.java:763)
	at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:59)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
	at org.eclipse.jetty.server.Server.handle(Server.java:516)
	at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:400)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:645)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:392)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
	at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
	at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.NoSuchMethodError: 'java.util.Stack org.apache.logging.log4j.util.StackLocatorUtil.getCurrentStackTrace()'
	at org.apache.logging.log4j.core.impl.ThrowableProxy.<init>(ThrowableProxy.java:111)
	at org.apache.logging.log4j.core.impl.ThrowableProxy.<init>(ThrowableProxy.java:96)
	at org.apache.logging.log4j.core.impl.Log4jLogEvent.getThrownProxy(Log4jLogEvent.java:629)
	at org.apache.logging.log4j.core.pattern.ExtendedThrowablePatternConverter.format(ExtendedThrowablePatternConverter.java:63)
	at org.apache.logging.log4j.core.layout.PatternLayout$NoFormatPatternSerializer.toSerializable(PatternLayout.java:343)
	at org.apache.logging.log4j.core.layout.PatternLayout.toText(PatternLayout.java:241)
	at org.apache.logging.log4j.core.layout.PatternLayout.encode(PatternLayout.java:226)
	at org.apache.logging.log4j.core.layout.PatternLayout.encode(PatternLayout.java:60)
	at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.directEncodeEvent(AbstractOutputStreamAppender.java:197)
	at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.tryAppend(AbstractOutputStreamAppender.java:190)
	at org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:181)
	at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:161)
	... 81 more

It doesn’t seem to break anything as the service-registry is deployed and is discovering all the services. This is my build.gradle

plugins {
    id "application"
    id "com.google.cloud.tools.jib" version "3.1.4"
    id "eclipse"
    id "com.leidos.leaf.base" version "3.6.0"
    id "com.leidos.leaf.metadata" version "3.6.0"
    id 'java-library'
    id "com.github.hierynomus.license" version "0.15.0"
    id 'maven-publish'
    id 'maven'
    id 'jacoco'
    id 'org.sonarqube'
    id 'com.palantir.git-version'
    id 'org.owasp.dependencycheck'
    id 'org.cyclonedx.bom'
}

apply from: "$rootDir/gradle/integrationTest.gradle"
apply from: "$rootDir/gradle/jacocoConfiguration.gradle"
apply from: "$rootDir/gradle/sonarqube.gradle"
apply from: "$rootDir/gradle/publishing.gradle"
apply from: "$rootDir/gradle/licensing.gradle"
apply from: "$rootDir/gradle/dependencyCheck.gradle"


generateMetadataConstants {
  dependsOn 'licenseFormat'
}

version = "0.1.0"
group = "com.leidos.falc2on.services.serviceregistry"

repositories {
    leafMavenRepo()
    mavenLocal()
}

leaf {
    frameworkVersion = "3.6.1"
    platformVersion = "3.6.0"
    metadata {
        dirs = [
            "src/main/resources/service_registry/beanmetadata":
            "${buildDir}/generated/src/main/java/${project.group.replace('.', '/')}/generated/metadata"
        ]
        lookupListDirs = [
            "src/main/resources/service_registry/lookuplists":
            "${buildDir}/generated/src/main/java/${project.group.replace('.', '/')}/generated/lookuplists"
        ]
        jar {
            enabled = true
        }
    }
}

ext {
    versions = [
        jettyMetrics: "4.1.0",
        jettyServlet: "9.4.44.v20210927",
        jettyWebsocket: "9.4.44.v20210927",
        restEasy: "4.6.1.Final",
        prometheus: "0.8.0",
        log4j2: "2.17.0",
        junit: "5.7.1"
    ]
}

configurations {
    all*.exclude group: 'log4j', module: 'log4j'
    all*.exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}

dependencies {
    api "com.leidos.falc2on.base:leaf-app-base:[4.0, 5.0)"
    implementation "com.leidos.leaf:framework-services-rest-easy"
    implementation "com.leidos.leaf:framework-services-kafka"
    implementation "com.leidos.leaf:framework-services-mongo"
    implementation "com.leidos.leaf:framework-services-hibernate"
    implementation "com.leidos.leaf:framework-services-metrics"
    implementation "com.leidos.leaf:framework-services-prometheus"
    implementation "org.apache.logging.log4j:log4j-core:${versions.log4j2}"
    implementation "org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j2}"
    implementation "org.apache.logging.log4j:log4j-1.2-api:${versions.log4j2}"
    implementation "com.leidos.leaf:platform-services-message-handling"
    implementation "com.leidos.leaf:platform-services-service-discovery"
    implementation "io.prometheus:simpleclient_hotspot:${versions.prometheus}"
    implementation "io.prometheus:simpleclient_dropwizard:${versions.prometheus}"
    implementation "io.prometheus:simpleclient_servlet:${versions.prometheus}"
    implementation "io.dropwizard.metrics:metrics-jetty9:${versions.jettyMetrics}"
    implementation "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final"
    implementation "org.eclipse.jetty:jetty-servlet:${versions.jettyServlet}"
    implementation "org.eclipse.jetty.websocket:javax-websocket-server-impl:${versions.jettyWebsocket}"
    implementation "org.jboss.resteasy:resteasy-wadl:${versions.restEasy}"
    implementation "io.swagger.core.v3:swagger-jaxrs2:2.1.9"
    implementation "org.aeonbits.owner:owner:1.0.12"
    implementation "com.github.ben-manes.caffeine:jcache:2.8.5"
    runtimeOnly "com.h2database:h2:1.4.200"
    testImplementation "org.junit.jupiter:junit-jupiter-api:${versions.junit}"
    testImplementation "org.mockito:mockito-core:3.5.0"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${versions.junit}"

    constraints {
        implementation("org.apache.logging.log4j:log4j-core:${versions.log4j2}") {
        because 'previous versions have a potential vulnerability impacting this application'
        }
        implementation("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j2}") {
        because 'previous versions have a potential vulnerability impacting this application'
        }
        implementation("org.apache.logging.log4j:log4j-1.2-api:${versions.log4j2}") {
        because 'previous versions have a potential vulnerability impacting this application'
        }
    }

}

application {
    mainClassName = 'com.leidos.falc2on.services.serviceregistry.ServiceRegistryApplication'
}

test {
    useJUnitPlatform()
}

jib {
    from {
        //The original location of this image can be found here: registry1.dso.mil/ironbank/redhat/openjdk/openjdk11
        image 'docker-group.leidos-leaf.com/ironbank/redhat/openjdk/openjdk11:1.11'
    }
    container {
        creationTime = 'USE_CURRENT_TIMESTAMP'
        jvmFlags = ['-XX:+HeapDumpOnOutOfMemoryError', '-XX:HeapDumpPath=/tmp/']
    }
}

Any ideas on what is causing that exception in the logs?

Could we see the dependencies section of your build.gradle? Any log4j dependencies (1.x or 2.x) including versions and your LEAF dependencies would be useful.

Also in src/main/resources, do you have a log4j2.xml or any other log4j config files we could see?

This is the dependencies section in my build.gradle

dependencies {
    api "com.leidos.falc2on.base:leaf-app-base:[4.0, 5.0)"
    implementation "com.leidos.leaf:framework-services-rest-easy"
    implementation "com.leidos.leaf:framework-services-kafka"
    implementation "com.leidos.leaf:framework-services-mongo"
    implementation "com.leidos.leaf:framework-services-hibernate"
    implementation "com.leidos.leaf:framework-services-metrics"
    implementation "com.leidos.leaf:framework-services-prometheus"
    implementation "org.apache.logging.log4j:log4j-core:${versions.log4j2}"
    implementation "org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j2}"
    implementation "org.apache.logging.log4j:log4j-1.2-api:${versions.log4j2}"
    implementation "com.leidos.leaf:platform-services-message-handling"
    implementation "com.leidos.leaf:platform-services-service-discovery"
    implementation "io.prometheus:simpleclient_hotspot:${versions.prometheus}"
    implementation "io.prometheus:simpleclient_dropwizard:${versions.prometheus}"
    implementation "io.prometheus:simpleclient_servlet:${versions.prometheus}"
    implementation "io.dropwizard.metrics:metrics-jetty9:${versions.jettyMetrics}"
    implementation "org.hibernate.javax.persistence:hibernate-jpa-2.1-api:1.0.0.Final"
    implementation "org.eclipse.jetty:jetty-servlet:${versions.jettyServlet}"
    implementation "org.eclipse.jetty.websocket:javax-websocket-server-impl:${versions.jettyWebsocket}"
    implementation "org.jboss.resteasy:resteasy-wadl:${versions.restEasy}"
    implementation "io.swagger.core.v3:swagger-jaxrs2:2.1.9"
    implementation "org.aeonbits.owner:owner:1.0.12"
    implementation "com.github.ben-manes.caffeine:jcache:2.8.5"
    runtimeOnly "com.h2database:h2:1.4.200"
    testImplementation "org.junit.jupiter:junit-jupiter-api:${versions.junit}"
    testImplementation "org.mockito:mockito-core:3.5.0"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${versions.junit}"

    constraints {
        implementation("org.apache.logging.log4j:log4j-core:${versions.log4j2}") {
        because 'previous versions have a potential vulnerability impacting this application'
        }
        implementation("org.apache.logging.log4j:log4j-slf4j-impl:${versions.log4j2}") {
        because 'previous versions have a potential vulnerability impacting this application'
        }
        implementation("org.apache.logging.log4j:log4j-1.2-api:${versions.log4j2}") {
        because 'previous versions have a potential vulnerability impacting this application'
        }
    }

}

and here is the version info

leaf {
    frameworkVersion = "3.6.1"
    platformVersion = "3.6.0"
...
}
ext {
    versions = [
        jettyMetrics: "4.1.0",
        jettyServlet: "9.4.44.v20210927",
        jettyWebsocket: "9.4.44.v20210927",
        restEasy: "4.6.1.Final",
        prometheus: "0.8.0",
        log4j2: "2.17.0",
        junit: "5.7.1"
    ]
}

and here is the log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--

    - - - - LEIDOS COPYRIGHT NOTICE - - - -
    Project Name: C4ISR Mission Thread IRAD. This software can not be copied and/or distributed without the express permission of Leidos.
    © 2022 Leidos.  All rights reserved.

-->
<Configuration status="WARN">
  <Properties>
    <Property name="projectDomain">com.leidos.falc2on.services.serviceregistry</Property>
  </Properties>
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout
        pattern="%d{HH:mm:ss.SSS} [%t] %highlight{%-5level} %logger{1.} - %msg%n" />
    </Console>
  </Appenders>
  <Loggers>
    <Logger
      name="com.leidos.leaf.distributable.manager.kafka.DistributableReaderKafka"
      level="${env:KAFKA_LOGGER_LEVEL:-warn}">
      <AppenderRef ref="Console" />
    </Logger>
    <Logger name="${projectDomain}"
      level="${env:SERVER_LOGGER_LEVEL:-info}" additivity="false">
      <AppenderRef ref="Console" />
    </Logger>
    <Root level="${env:ROOT_LOGGER_LEVEL:-info}">
      <AppenderRef ref="Console" />
    </Root>
  </Loggers>
</Configuration>

Hi Jacob, I can’t test this case but I think the issue may be caused by your log4j2 version, which is currently set to "2.17.0", setting this to "2.17.2" hopefully should fix this issue.

This was the fix. Thanks!

1 Like