You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Piotr Karwasz (Jira)" <ji...@apache.org> on 2022/06/21 15:28:00 UTC

[jira] [Commented] (LOG4J2-3541) ThreadContextDataInjector Uses Incorrect Providers Under Tomcat

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

Piotr Karwasz commented on LOG4J2-3541:
---------------------------------------

Hi [~davehawkins],

Your hypothesis is correct: many Log4j2 components in the 2.x series, including {{{}ContextDataProviders{}}}, have a static scope and are the same for all logger contexts. This is unlikely to change.

In version 3.x there will be a proper dependency injection framework and all those components should migrate to a {{LoggerContext}} scope.

In the meantime you can work around this limitation by:
 * having a copy of `log4j-api` and `log4j-core` in each application,
 * using the standard Tomcat's {{{}ClassLoaderLogManager{}}},
 * adding a {{WEB-INF/logging.properties}} to each application that configures a single {{Log4jBridgeHandler}} to forward JUL messages to the appropriate Log4j2 logger context.

> ThreadContextDataInjector Uses Incorrect Providers Under Tomcat
> ---------------------------------------------------------------
>
>                 Key: LOG4J2-3541
>                 URL: https://issues.apache.org/jira/browse/LOG4J2-3541
>             Project: Log4j 2
>          Issue Type: Bug
>          Components: Core, Web/Servlet
>    Affects Versions: 2.17.1
>         Environment: Tomcat 9.0.58 with the following jars in ${CATALINA_HOME}/lib:
> log4j-api-2.17.1.jar
> log4j-core-2.17.1.jar
> log4j-jul-2.17.1.jar
> JUL LogManager is org.apache.logging.log4j.jul.LogManager
>            Reporter: Dave Hawkins
>            Priority: Major
>
> We are using Log4j with tomcat by including it in the boot classpath and using Log4jServletContextListener in the web.xml. We are also using the log4j JUL LogManager. Web application ContextDataProviders are not being loaded correctly.
> I think this is because ThreadContextDataInjector::getServiceProviders is sensitive to the web application classpath, but the class, which is shared between the web applications and tomcat, statically caches the result. The providers list for tomcat is initialized first and is thus incorrectly used for the web applications.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)