Log4j升级至2.20.0后RCP(OSGI)应用启动加载OSGI服务失败求助
Log4j 2.20.0升级后OSGI RCP应用启动异常求助
我们将基于OSGI的RCP应用中的Log4j从2.17.1版本升级至2.20.0版本后,启动时抛出大量空指针异常。此前数年,我们一直依赖两种OSGI环境下的Log4j配置方案:一是Stack Overflow上关于Log4j2 API无法找到Core组件的解决方案,二是第三方技术博客中Log4j2在OSGI上下文的配置指南。
查看Log4j2源码发现,2.20.0版本新增了OsgiServiceLocator类,OSGI相关服务定位逻辑有重大变更,但我们找不到适配RCP应用的新配置方法,特此求助。
异常信息
ERROR StatusLogger Unable to load OSGI services for service class org.apache.logging.log4j.spi.Provider java.lang.NullPointerException: Cannot invoke "org.osgi.framework.BundleContext.getServiceReferences(java.lang.Class, String)" because "ctx" is null at org.apache.logging.log4j.util.OsgiServiceLocator.loadServices(OsgiServiceLocator.java:61) at org.apache.logging.log4j.util.ServiceLoaderUtil.loadServices(ServiceLoaderUtil.java:92) at org.apache.logging.log4j.util.ServiceLoaderUtil.loadServices(ServiceLoaderUtil.java:77) at org.apache.logging.log4j.util.ProviderUtil.<init>(ProviderUtil.java:67) at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:145) at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:129) at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:90) ERROR StatusLogger Unable to load OSGI services for service interface org.apache.logging.log4j.core.util.ContextDataProvider java.lang.NullPointerException: Cannot invoke "org.osgi.framework.BundleContext.getServiceReferences(java.lang.Class, String)" because "ctx" is null at org.apache.logging.log4j.util.OsgiServiceLocator.loadServices(OsgiServiceLocator.java:61) at org.apache.logging.log4j.util.ServiceLoaderUtil.loadServices(ServiceLoaderUtil.java:92) at org.apache.logging.log4j.util.ServiceLoaderUtil.loadServices(ServiceLoaderUtil.java:77) at org.apache.logging.log4j.core.impl.ThreadContextDataInjector.getServiceProviders(ThreadContextDataInjector.java:77) at org.apache.logging.log4j.core.impl.ThreadContextDataInjector.<clinit>(ThreadContextDataInjector.java:64) at org.apache.logging.log4j.core.impl.ThreadContextDataInjector$ForDefaultThreadContextMap.<init>(ThreadContextDataInjector.java:93) at org.apache.logging.log4j.core.impl.ContextDataInjectorFactory.createDefaultInjector(ContextDataInjectorFactory.java:91) at org.apache.logging.log4j.core.impl.ContextDataInjectorFactory.createInjector(ContextDataInjectorFactory.java:71) at org.apache.logging.log4j.core.lookup.ContextMapLookup.<init>(ContextMapLookup.java:34) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) at org.apache.logging.log4j.core.util.ReflectionUtil.instantiate(ReflectionUtil.java:189) at org.apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:86) at org.apache.logging.log4j.core.lookup.Interpolator.<init>(Interpolator.java:105) at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:135) at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32) at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:74) 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:196) at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:599) ERROR StatusLogger Unable to load OSGI services for service interface org.apache.logging.log4j.core.util.WatchEventService java.lang.NullPointerException: Cannot invoke "org.osgi.framework.BundleContext.getServiceReferences(java.lang.Class, String)" because "ctx" is null at org.apache.logging.log4j.util.OsgiServiceLocator.loadServices(OsgiServiceLocator.java:61) at org.apache.logging.log4j.util.ServiceLoaderUtil.loadServices(ServiceLoaderUtil.java:92) at org.apache.logging.log4j.util.ServiceLoaderUtil.loadServices(ServiceLoaderUtil.java:77) at org.apache.logging.log4j.core.util.WatchManager.<init>(WatchManager.java:137) at org.apache.logging.log4j.core.config.AbstractConfiguration.<init>(AbstractConfiguration.java:142) at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32) at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:74) 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:196) at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:599)
内容的提问来源于stack exchange,提问作者BetaRide
相关产品推荐
相关产品推荐

