jn5047
jn5047

Reputation: 101

How to resolve SLF4J, LOG4j2 issue in OSGi Application?

I have an OSGi Application that uses log4j 2.17.1, slf4j-api-2.0.3.jar, and slf4j-reload4j-2.0.3.jar. The web server is running Tomcat 8.0.53. I'm getting this log4j2 error in the debug log when starting the application, and I'm not getting any logs although the application is running.

DEBUG StatusLogger Not in a ServletContext environment, thus not loading WebLookup plugin.
DEBUG StatusLogger Unable to retrieve WatchEventService from ClassLoader org.company.dao.webcontainer.tomcat.WebAppClassLoader@140c9f39
 java.lang.NullPointerException
    at java.util.ServiceLoader$LazyIterator.hasNextService(ServiceLoader.java:354)
    at java.util.ServiceLoader$LazyIterator.hasNext(ServiceLoader.java:393)
    at java.util.ServiceLoader$1.hasNext(ServiceLoader.java:474)
    at org.apache.logging.log4j.core.util.WatchManager.getEventServices(WatchManager.java:164)
    at org.apache.logging.log4j.core.util.WatchManager.<init>(WatchManager.java:137)
    at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:140)
    at org.apache.logging.log4j.core.config.DefaultConfiguration.<init>(DefaultConfiguration.java:46)
    at org.apache.logging.log4j.core.LoggerContext.<init>(LoggerContext.java:95)
    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:140)
    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:309)
    at org.apache.log4j.LogManager$PrivateManager.getContext(LogManager.java:244)
    at org.apache.log4j.LogManager.getRootLogger(LogManager.java:89)
    at org.slf4j.reload4j.Reload4jLoggerFactory.<init>(Reload4jLoggerFactory.java:66)
    at org.slf4j.reload4j.Reload4jServiceProvider.initialize(Reload4jServiceProvider.java:35)
    at org.slf4j.LoggerFactory.bind(LoggerFactory.java:152)
    at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:139)
    at org.slf4j.LoggerFactory.getProvider(LoggerFactory.java:422)
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:408)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.cxf.common.logging.LogUtils.<clinit>(LogUtils.java:103)
    at org.apache.cxf.configuration.spring.AbstractBeanDefinitionParser.<clinit>(AbstractBeanDefinitionParser.java:65)
    at org.apache.cxf.jaxrs.spring.NamespaceHandler.init(NamespaceHandler.java:27)
    at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(DefaultNamespaceHandlerResolver.java:131)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1406)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1401)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:168)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:138)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
    at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
    at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
    at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:609)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:510)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:444)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:326)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4900)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5363)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:755)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:731)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
    at org.company.dao.webcontainer.tomcat.TomcatWrapper.startWebApp(TomcatWrapper.java:187)
    at org.company.dao.webcontainer.tomcat.TomcatWrapper.prepareAllWebApps(TomcatWrapper.java:141)
    at org.company.dao.webcontainer.tomcat.TomcatWrapper.startServer(TomcatWrapper.java:208)
    at org.company.dao.webcontainer.tomcat.Application.start(Application.java:30)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1465)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1438)

I have org.apache.logging.log4j.core.util in the 'Export-Package' of the MANIFEST.MF file. Am I missing anything?

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Dao Logging
Bundle-SymbolicName: org.company.dao.logging;singleton:=true
Bundle-Version: 1.0.0
Bundle-Activator: org.company.dao.logging.Activator
Require-Bundle: org.eclipse.core.runtime
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: bin/,
 lib/slf4j-api-2.0.3.jar,
 lib/log4j-slf4j-impl-2.17.1.jar,
 lib/log4j-1.2-api-2.17.1.jar,
 lib/log4j-api-2.17.1.jar,
 lib/log4j-core-2.17.1.jar,
 lib/commons-logging-1.2.jar
Export-Package: org.apache.commons.logging,
 org.apache.commons.logging.impl,
 org.apache.log4j,
 org.apache.log4j.bridge,
 org.apache.log4j.builders,
 org.apache.log4j.builders.appender,
 org.apache.log4j.builders.filter,
 org.apache.log4j.builders.layout,
 org.apache.log4j.builders.rewrite,
 org.apache.log4j.builders.rolling,
 org.apache.log4j.component.helpers,
 org.apache.log4j.config,
 org.apache.log4j.helpers,
 org.apache.log4j.jmx,
 org.apache.log4j.layout,
 org.apache.log4j.legacy.core,
 org.apache.log4j.or,
 org.apache.log4j.or.jms,
 org.apache.log4j.pattern,
 org.apache.log4j.rewrite,
 org.apache.log4j.spi,
 org.apache.log4j.varia,
 org.apache.log4j.xml,
 org.apache.logging.log4j,
 org.apache.logging.log4j.core,
 org.apache.logging.log4j.core.appender,
 org.apache.logging.log4j.core.appender.db,
 org.apache.logging.log4j.core.appender.db.jdbc,
 org.apache.logging.log4j.core.appender.mom,
 org.apache.logging.log4j.core.appender.mom.jeromq,
 org.apache.logging.log4j.core.appender.mom.kafka,
 org.apache.logging.log4j.core.appender.nosql,
 org.apache.logging.log4j.core.appender.rewrite,
 org.apache.logging.log4j.core.appender.rolling,
 org.apache.logging.log4j.core.appender.rolling.action,
 org.apache.logging.log4j.core.appender.routing,
 org.apache.logging.log4j.core.async,
 org.apache.logging.log4j.core.config,
 org.apache.logging.log4j.core.config.arbiters,
 org.apache.logging.log4j.core.config.builder.api,
 org.apache.logging.log4j.core.config.builder.impl,
 org.apache.logging.log4j.core.config.composite,
 org.apache.logging.log4j.core.config.json,
 org.apache.logging.log4j.core.config.plugins,
 org.apache.logging.log4j.core.config.plugins.convert,
 org.apache.logging.log4j.core.config.plugins.processor,
 org.apache.logging.log4j.core.config.plugins.util,
 org.apache.logging.log4j.core.config.plugins.validation,
 org.apache.logging.log4j.core.config.plugins.validation.constraints,
 org.apache.logging.log4j.core.config.plugins.validation.validators,
 org.apache.logging.log4j.core.config.plugins.visitors,
 org.apache.logging.log4j.core.config.properties,
 org.apache.logging.log4j.core.config.status,
 org.apache.logging.log4j.core.config.xml,
 org.apache.logging.log4j.core.config.yaml,
 org.apache.logging.log4j.core.filter,
 org.apache.logging.log4j.core.impl,
 org.apache.logging.log4j.core.jackson,
 org.apache.logging.log4j.core.jmx,
 org.apache.logging.log4j.core.layout,
 org.apache.logging.log4j.core.layout.internal,
 org.apache.logging.log4j.core.lookup,
 org.apache.logging.log4j.core.message,
 org.apache.logging.log4j.core.net,
 org.apache.logging.log4j.core.net.ssl,
 org.apache.logging.log4j.core.osgi,
 org.apache.logging.log4j.core.parser,
 org.apache.logging.log4j.core.pattern,
 org.apache.logging.log4j.core.script,
 org.apache.logging.log4j.core.selector,
 org.apache.logging.log4j.core.time,
 org.apache.logging.log4j.core.time.internal,
 org.apache.logging.log4j.core.tools,
 org.apache.logging.log4j.core.tools.picocli,
 org.apache.logging.log4j.core.util,
 org.apache.logging.log4j.core.util.datetime,
 org.apache.logging.log4j.internal,
 org.apache.logging.log4j.message,
 org.apache.logging.log4j.simple,
 org.apache.logging.log4j.spi,
 org.apache.logging.log4j.status,
 org.apache.logging.log4j.util,
 org.apache.logging.slf4j,
 org.slf4j,
 org.slf4j.event,
 org.slf4j.helpers,
 org.slf4j.impl,
 org.slf4j.spi

edit Updating log4j to 2.19.0 cleared the error but I'm getting messages like this now

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
SLF4J: Ignoring binding found at [bundleresource://8.fwk600746945:2/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.

Here's all of the slf4j jars in my OSGi Bundle

root@8be4d7b90d60:/opt/core_server/default/plugins# find . -name "*slf4j*"
./com.company.platform.analytics.agent.model-2.0.0-SNAPSHOT/target/lib/slf4j-reload4j-2.0.3.jar
./com.company.platform.analytics.agent.model-2.0.0-SNAPSHOT/target/lib/slf4j-api-2.0.3.jar
./com.github.codegerm:org.cg.eventbus-1.0.9/target/lib/slf4j-reload4j-2.0.3.jar
./com.github.codegerm:org.cg.eventbus-1.0.9/target/lib/slf4j-api-2.0.3.jar
./com.company.platform.internal.agent-2.0.0-SNAPSHOT/target/lib/slf4j-reload4j-2.0.3.jar
./com.company.platform.internal.agent-2.0.0-SNAPSHOT/target/lib/slf4j-api-2.0.3.jar
./com.company.platform.data.common-2.0.0-SNAPSHOT/target/lib/slf4j-reload4j-2.0.3.jar
./com.company.platform.data.common-2.0.0-SNAPSHOT/target/lib/slf4j-api-2.0.3.jar
./com.github.codegerm:org.cg.services.core-1.0.12/target/lib/slf4j-reload4j-2.0.3.jar
./com.github.codegerm:org.cg.services.core-1.0.12/target/lib/slf4j-api-2.0.3.jar
./com.company.platform.configuration.management:com.company.platform.configuration.management-2.0.0-SNAPSHOT/target/lib/slf4j-reload4j-2.0.3.jar
./com.company.platform.configuration.management:com.company.platform.configuration.management-2.0.0-SNAPSHOT/target/lib/slf4j-api-2.0.3.jar
./org.cg.dao.logging_1.0.0/lib/log4j-slf4j-impl-2.19.0.jar
./org.cg.dao.logging_1.0.0/lib/slf4j-api-2.0.3.jar
./com.company.platform.ingestion-2.0.0-SNAPSHOT/target/lib/slf4j-reload4j-2.0.3.jar
./com.company.platform.ingestion-2.0.0-SNAPSHOT/target/lib/slf4j-api-2.0.3.jar
./com.company.platform.ingestion-2.0.0-SNAPSHOT/target/lib/jcl-over-slf4j-1.7.14.jar
./com.company.platform.security-2.0.0-SNAPSHOT/target/lib/slf4j-reload4j-2.0.3.jar
./com.company.platform.security-2.0.0-SNAPSHOT/target/lib/slf4j-api-2.0.3.jar
./com.company.platform.security-2.0.0-SNAPSHOT/target/lib/jcl-over-slf4j-1.7.14.jar

edit-2 Replacing log4j-slf4j-impl-2.19.0.jar with log4j-slf4j2-impl-2.19.0.jar fixed the "SLF4J: No SLF4J providers were found" issue.

Upvotes: 0

Views: 1256

Answers (1)

jn5047
jn5047

Reputation: 101

Thanks to @Piotr!

I had to upgrade log4j to 2.19.0 then use log4j-slf4j2-impl instead of log4j-slf4j-impl to bind with slf4j 2.0.3.

All is good now!

Upvotes: 2

Related Questions