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)