You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "lqjacklee (Jira)" <ji...@apache.org> on 2019/11/28 03:04:00 UTC
[jira] [Commented] (LOG4J2-2377) NullPointerException in
org.apache.logging.log4j.util.LoaderUtil.getClassLoaders() when using
Bootstrap class loader
[ https://issues.apache.org/jira/browse/LOG4J2-2377?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16984104#comment-16984104 ]
lqjacklee commented on LOG4J2-2377:
-----------------------------------
[~mirko24] When I append the dependencies as below :
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito2</artifactId>
<version>1.7.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>us.zoom.commons.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1-RELEASE</version>
</dependency>
in the org.apache.logging.log4j.util.ProviderUtil#ProviderUtil, LoaderUtil.getClassLoaders() will return the MockClassLoader , Launcher@AppClassLoader, Launcher@ExtClassLoader. When to load the class org.apache.logging.log4j.spi.Provider under the Launcher@AppClassLoader, the
org.apache.logging.log4j.util.ProviderUtil#loadProviders(java.lang.ClassLoader)
ServiceLoader.load(Provider.class, classLoader);
the Provider.class's classloader is current thread local class loader : MockClassLoader. finally
java.util.ServiceLoader.LazyIterator#nextService
if (!service.isAssignableFrom(c)) {
fail(service,
"Provider " + cn + " not a subtype");
}
service's class loader is MockClassLoader is not consistent with the c' classLoader which is Launcher@AppClassLoader.
Due to the exception occur, org.apache.logging.log4j.util.ProviderUtil#ProviderUtil
LOGGER.debug("Unable to retrieve provider from ClassLoader {}", classLoader, ex); will trigger.
We extend the AbstactLogger to invoke ThreadContext.get(ZOOM_LOG_DEBUG_ON) leads to NPE.
> NullPointerException in org.apache.logging.log4j.util.LoaderUtil.getClassLoaders() when using Bootstrap class loader
> --------------------------------------------------------------------------------------------------------------------
>
> Key: LOG4J2-2377
> URL: https://issues.apache.org/jira/browse/LOG4J2-2377
> Project: Log4j 2
> Issue Type: Bug
> Components: API
> Affects Versions: 2.9.1, 2.10.0, 2.11.0
> Reporter: Mirko Rzehak
> Priority: Blocker
> Fix For: 3.0.0, 2.11.1
>
>
> When log4j2 classes are loaded via the Bootstrap classloader, creating a Logger ({{LogManager.getLogger()}}) causes a NullPointerException:
> {code:java}
> Exception in thread "main" java.lang.ExceptionInInitializerError
> at Test.<clinit>(Test.java:6)
> Caused by: java.lang.NullPointerException
> at org.apache.logging.log4j.util.LoaderUtil.getClassLoaders(LoaderUtil.java:115)
> at org.apache.logging.log4j.util.ProviderUtil.<init>(ProviderUtil.java:66)
> at org.apache.logging.log4j.util.ProviderUtil.lazyInit(ProviderUtil.java:146)
> at org.apache.logging.log4j.util.ProviderUtil.hasProviders(ProviderUtil.java:130)
> at org.apache.logging.log4j.LogManager.<clinit>(LogManager.java:89)
> ... 1 more
> {code}
> To reproduce this behavior I put the log4j jar files (log4j-api and log4j-core) into a dedicated directory and start my test program with {{-Djava.endorsed.dirs=dirname}}. Classes from jars in that directory are loaded using the Bootstrap classloader.
>
> The issue came with 2.9.1. It worked with 2.9.0 and earlier versions.
--
This message was sent by Atlassian Jira
(v8.3.4#803005)