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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org