From 2d816101d577f30d382bba89c9c1f8d8d5e54d46 Mon Sep 17 00:00:00 2001 From: kkolinko Date: Thu, 4 Mar 2010 00:18:44 +0000 Subject: [PATCH] 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. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@918787 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/juli/ClassLoaderLogManager.java | 42 ++++++++++++++++++------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/java/org/apache/juli/ClassLoaderLogManager.java b/java/org/apache/juli/ClassLoaderLogManager.java index 993ee3fd0..576fb385f 100644 --- a/java/org/apache/juli/ClassLoaderLogManager.java +++ b/java/org/apache/juli/ClassLoaderLogManager.java @@ -300,6 +300,14 @@ public class ClassLoaderLogManager extends LogManager { } + @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 @@ public class ClassLoaderLogManager extends LogManager { // 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(); } } -- 2.11.0