You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@logging.apache.org by "jncharpin (JIRA)" <ji...@apache.org> on 2017/09/05 19:15:00 UTC

[jira] [Comment Edited] (LOG4J2-2030) ClassCastException: org.apache.logging.log4j.simple.SimpleLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext

    [ https://issues.apache.org/jira/browse/LOG4J2-2030?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16154149#comment-16154149 ] 

jncharpin edited comment on LOG4J2-2030 at 9/5/17 7:14 PM:
-----------------------------------------------------------

This is the stack trace where Log4jInvoker, simply doing a Configurator.setLevel(), is loaded from an isolated classloader, containing log4j jars. Otherwise there is no log4j jlibs part of the classpath.

{{Caused by: java.lang.ClassCastException: org.apache.logging.log4j.simple.SimpleLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext
	at org.apache.logging.log4j.core.LoggerContext.getContext(LoggerContext.java:190)
	at org.apache.logging.log4j.core.config.Configurator.setLevel(Configurator.java:291)
	at com.util.Log4jInvoker.doIt(Log4jInvoker.java:11)}}

The point is that the ServiceLoader doesn't find the ServiceProvider, then the search is still performed with the PROVIDER_RESOURCE on each classloader, including the URLClassloader above, but the PROVIDER_RESOURCE is missing in 2.9.0 jar. 
Wondering if same ServiceLoader should be performed on each "candidates" rather than this getResources.

 {{private ProviderUtil() {
        loadProviders(findClassLoader());
        for (final LoaderUtil.UrlResource resource : LoaderUtil.findUrlResources(PROVIDER_RESOURCE)) {
            loadProvider(resource.getUrl(), resource.getClassLoader());
        }
    }

   final ClassLoader[] candidates = {getThreadContextClassLoader(), *LoaderUtil.class.getClassLoader()*,
                GET_CLASS_LOADER_DISABLED ? null : ClassLoader.getSystemClassLoader()};
}}



 


was (Author: jncharpin):
This is the stack trace where Log4jInvoker, simply doing a Configurator.setLevel(), is loaded from an isolated classloader, containing log4j jars. Otherwise there is no log4j jlibs part of the classpath.

{{Caused by: java.lang.ClassCastException: org.apache.logging.log4j.simple.SimpleLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext
	at org.apache.logging.log4j.core.LoggerContext.getContext(LoggerContext.java:190)
	at org.apache.logging.log4j.core.config.Configurator.setLevel(Configurator.java:291)
	at com.util.Log4jInvoker.doIt(Log4jInvoker.java:11)}}

The point is that the ServiceLoader doesn't find the ServiceProvider, then the search is still performed with the PROVIDER_RESOURCE on each classloader, including the URLClassloader above, but the PROVIDER_RESOURCE is missing in 2.9.0 jar. 
Wondering if same ServiceLoader should be performed on each "candidates" rather than this getResources.

{{ private ProviderUtil() {
        loadProviders(findClassLoader());
        for (final LoaderUtil.UrlResource resource : LoaderUtil.findUrlResources(PROVIDER_RESOURCE)) {
            loadProvider(resource.getUrl(), resource.getClassLoader());
        }
    }}}

   {{ final ClassLoader[] candidates = {getThreadContextClassLoader(), *LoaderUtil.class.getClassLoader()*,
                GET_CLASS_LOADER_DISABLED ? null : ClassLoader.getSystemClassLoader()};}}




 

> ClassCastException: org.apache.logging.log4j.simple.SimpleLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext
> -------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: LOG4J2-2030
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-2030
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.9.0
>            Reporter: jncharpin
>
> When upgrading from 2.8.2 to 2.9.0, we are facing the following exception when accessing the context.
> Caused by: java.lang.ClassCastException: org.apache.logging.log4j.simple.SimpleLoggerContext cannot be cast to org.apache.logging.log4j.core.LoggerContext
> 	at org.apache.logging.log4j.core.LoggerContext.getContext(LoggerContext.java:190)
> 	at org.apache.logging.log4j.core.config.Configurator.setLevel(Configurator.java:291)
> Seems like that the context factory is incorrect and defaulted to {{SimpleLoggerContextFactory}} because of the provider is not able to find the resource {{META-INF/log4j-provider.properties}} which is missing in 2.9.0 if not wrong.



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)