[
https://issues.apache.org/jira/browse/LOG4J2-3646?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17653853#comment-17653853
]
Piotr Karwasz commented on LOG4J2-3646:
---------------------------------------
[~matthewfirth],
JUL has no concept of logger context. Tomcat solves this by making
{{Logger.getLogger}} a context-sensitive method.
If your application has no {{logging.properties}} file in the webapp
classloader, Tomcat attaches the root logger of your application's "logger
context" to the root logger of the "global logger context". I don't see
anything wrong in this (the main problem is JUL).
I agree that calling `setUseParentHandlers(false)` (even unconditionally) is
the right thing to do. Can you send a PR on Github with your fix and a unit
test? You can find a similar unit test in {{slf4j-to-jul}}:
{{org.apache.logging.log4j.tojul.JULLoggerTest}}
> Log4jBridgeHandler does not work OTB on Tomcat 10.1
> ---------------------------------------------------
>
> Key: LOG4J2-3646
> URL: https://issues.apache.org/jira/browse/LOG4J2-3646
> Project: Log4j 2
> Issue Type: Bug
> Components: JUL adapter
> Affects Versions: 2.19.0
> Reporter: Matthew Firth
> Priority: Minor
>
> Related to the issue I filed in the Tomcat Bugzilla:
> [https://bz.apache.org/bugzilla/show_bug.cgi?id=66406]
> The Log4jBridgeHandler's logic to clear existing handlers on the root logger
> doesn't work in TC 10 and possibly other situations. The result is that I
> get all log messages published twice - once to the console by JUL and then
> once again by log4j.
> Log4jBridgeHandler.getJulRootLogger() assumes that the "root logger" is the
> one returned by getLogger("").
> When running TC10 with JULI (the default), that Logger actually has two
> parents - and the grand-parent Logger has the Console Handler attached to it.
> Even if the Tomcat Project doesn't change JULI, I suggest log4j could be
> defensive and simply block parent loggers if any exist.
> For example - ammending Log4jBridgeHandler.install() like this:
> {noformat}
> if (removeHandlersForRootLogger) {
> for (java.util.logging.Handler hdl : rootLogger.getHandlers()) {
> rootLogger.removeHandler(hdl);
> }
>
> if (rootLogger.getParent() != null)
> rootLogger.setUseParentHandlers(false);
> rootLogger.addHandler(new Log4jBridgeHandler(false, suffixToAppend,
> propagateLevels));
> }
>
> {noformat}
>
>
> )
--
This message was sent by Atlassian Jira
(v8.20.10#820010)