You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kk...@apache.org on 2010/03/04 01:18:44 UTC

svn commit: r918787 - /tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java

Author: kkolinko
Date: Thu Mar  4 00:18:44 2010
New Revision: 918787

URL: http://svn.apache.org/viewvc?rev=918787&view=rev
Log:
Fix 2. of https://issues.apache.org/bugzilla/show_bug.cgi?id=48831#c3
When resetting a logger do not close handlers that do not belong to the current class loader.

Modified:
    tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java

Modified: tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java?rev=918787&r1=918786&r2=918787&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java (original)
+++ tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java Thu Mar  4 00:18:44 2010
@@ -300,6 +300,14 @@
     
     }
 
+    @Override
+    public void reset() throws SecurityException {
+        ClassLoader classLoader = Thread.currentThread()
+                .getContextClassLoader();
+        ClassLoaderLogInfo clLogInfo = getClassLoaderInfo(classLoader);
+        resetLoggers(clLogInfo);
+        super.reset();
+    }
 
     /**
      * Shuts down the logging system.
@@ -308,23 +316,33 @@
         // The JVM is being shutdown. Make sure all loggers for all class
         // loaders are shutdown
         for (ClassLoaderLogInfo clLogInfo : classLoaderLoggers.values()) {
-            for (Logger logger : clLogInfo.loggers.values()) {
-                resetLogger(logger);
-            }
+            resetLoggers(clLogInfo);
         }
     }
 
     // -------------------------------------------------------- Private Methods
-    private void resetLogger(Logger logger) {
-        
-        Handler[] handlers = logger.getHandlers();
-        for (Handler handler : handlers) {
-            logger.removeHandler(handler);
-            try {
-                handler.close();
-            } catch (Exception e) {
-                // Ignore
+    private void resetLoggers(ClassLoaderLogInfo clLogInfo) {
+        // This differs from LogManager#resetLogger() in that we close not all
+        // handlers of all loggers, but only those that are present in our
+        // ClassLoaderLogInfo#handlers list. That is because our #addLogger(..)
+        // method can use handlers from the parent class loaders, and closing
+        // handlers that the current class loader does not own would be not
+        // good.
+        synchronized (clLogInfo) {
+            for (Logger logger : clLogInfo.loggers.values()) {
+                Handler[] handlers = logger.getHandlers();
+                for (Handler handler : handlers) {
+                    logger.removeHandler(handler);
+                }
+            }
+            for (Handler handler : clLogInfo.handlers.values()) {
+                try {
+                    handler.close();
+                } catch (Exception e) {
+                    // Ignore
+                }
             }
+            clLogInfo.handlers.clear();
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org