[ 
http://jira.qos.ch/browse/LBCLASSIC-256?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12358#action_12358
 ] 

Martin Maier commented on LBCLASSIC-256:
----------------------------------------

I have the same problem as described by Samuel. Would be great if this could be 
fixed at some point.

> java.util.logging propagated level changes are lost because of race condition 
> with garbage collection
> -----------------------------------------------------------------------------------------------------
>
>                 Key: LBCLASSIC-256
>                 URL: http://jira.qos.ch/browse/LBCLASSIC-256
>             Project: logback-classic
>          Issue Type: Bug
>    Affects Versions: 0.9.28
>         Environment: win7 64-bit, bootstrapped in a Tomcat server
>            Reporter: Samuel Stanojevic
>            Assignee: Ceki Gulcu
>         Attachments: LevelChangePropagator.java
>
>
> I have bootstrapped logback in my Tomcat server, and have setup JUL to 
> redirect logging requests to SLF4J by adding the following in my 
> logging.properties:
> .handlers = org.slf4j.bridge.SLF4JBridgeHandler
> Anyways, my setup works pretty nicely.  The problem is when I try to activate 
> the JUL LevelChangePropagator, the info doesn't quite propagate as expected.
> Here is my config:
> <configuration debug="true">
>   <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
>     <resetJUL>true</resetJUL>
>   </contextListener>
>   
>   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
>     <!-- encoders are assigned the type
>          ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
>     <encoder>
>       <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - 
> %msg%n</pattern>
>     </encoder>
>     <target>System.out</target>
>   </appender>
>   <root level="ERROR">
>     <appender-ref ref="STDOUT" />
>   </root>
>   
>   <logger name="test.propagation" level="TRACE"/> <!-- race condition here? 
> -->
> </configuration>
> The problem is that if my app tries to do:
>   java.util.logging.Logger.getLogger("test.propagation").fine("hello world");
> ..., it doesn't print.
> I have confirmed that the bug is because, even though the 
> LevelChangePropagator class does propagate the level change info to JUL, it 
> fails to keep a strong reference to the logger that it just changed.  By not 
> keeping a strong reference, and because the JUL LogManager only keeps 
> WeakReferences to loggers, then the GC has time to clear out the change 
> before the app's first attempt to use the logger.  (see 
> java.util.logging.LogManager#addLogger where the javadoc says "The 
> application should retain its own reference to the Logger object to avoid it 
> being garbage collected.  The LogManager may only retain a weak reference")
> To test my hunch, I patched the LevelChangePropagator class by adding a 
> global hashset of java.util.logging.Logger, and I systematically add the 
> loggers to the hashset in the method "propagate(logger,level)". After this 
> patch, my logging started working as expected.
> My fix may not be the best, and may have implications that I did not think 
> about, but I think something along those lines needs to be done to fix the 
> bug.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://jira.qos.ch/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        
_______________________________________________
logback-dev mailing list
[email protected]
http://mailman.qos.ch/mailman/listinfo/logback-dev

Reply via email to