From fc4685cf179729fb908de4319161b96da2ffffa6 Mon Sep 17 00:00:00 2001 From: markt Date: Tue, 12 Jan 2010 19:06:48 +0000 Subject: [PATCH] Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48421 Clean up a web application's logs and handlers when it stops. This involved modifying the fix that prevented log messages being lost in shutdown. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@898468 13f79535-47bb-0310-9956-ffa450edef68 --- java/org/apache/juli/ClassLoaderLogManager.java | 67 +++++++++++++++---------- java/org/apache/juli/logging/LogFactory.java | 7 ++- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/java/org/apache/juli/ClassLoaderLogManager.java b/java/org/apache/juli/ClassLoaderLogManager.java index 32effe8b2..96ddf1725 100644 --- a/java/org/apache/juli/ClassLoaderLogManager.java +++ b/java/org/apache/juli/ClassLoaderLogManager.java @@ -46,6 +46,46 @@ import java.util.logging.Logger; */ public class ClassLoaderLogManager extends LogManager { + private final class Cleaner extends Thread { + + @Override + public void run() { + // The JVM us 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); + } + } + } + + private void resetLogger(Logger logger) { + + Handler[] handlers = logger.getHandlers(); + for (Handler handler : handlers) { + logger.removeHandler(handler); + try { + handler.close(); + } catch (Exception e) { + // Ignore + } + } + } + + } + + + // ------------------------------------------------------------Constructors + + public ClassLoaderLogManager() { + super(); + try { + Runtime.getRuntime().addShutdownHook(new Cleaner()); + } catch (IllegalStateException ise) { + // We are probably already being shutdown. Ignore this error. + } + } + // -------------------------------------------------------------- Variables @@ -485,33 +525,6 @@ public class ClassLoaderLogManager extends LogManager { } - /** - * Need to override reset so the loggers loaded by the web applications can - * be shutdown. - */ - @Override - public void reset() { - super.reset(); - for (ClassLoaderLogInfo classLoaderLogInfo : classLoaderLoggers.values()) { - for (Logger logger : classLoaderLogInfo.loggers.values()) { - resetLogger(logger); - } - } - } - - private void resetLogger(Logger logger) { - - Handler[] handlers = logger.getHandlers(); - for (Handler handler : handlers) { - logger.removeHandler(handler); - try { - handler.close(); - } catch (Exception e) { - // Ignore - } - } - } - // ---------------------------------------------------- LogNode Inner Class diff --git a/java/org/apache/juli/logging/LogFactory.java b/java/org/apache/juli/logging/LogFactory.java index a43373471..09d7e2746 100644 --- a/java/org/apache/juli/logging/LogFactory.java +++ b/java/org/apache/juli/logging/LogFactory.java @@ -19,6 +19,7 @@ package org.apache.juli.logging; import java.util.Properties; +import java.util.logging.LogManager; @@ -325,8 +326,10 @@ public /* abstract */ class LogFactory { * * @param classLoader ClassLoader for which to release the LogFactory */ - public static void release(ClassLoader classLoader) { - // nothing - we don't use any class loaders + public static void release( + @SuppressWarnings("unused") ClassLoader classLoader) { + // JULI's log manager looks at the current classLoader + LogManager.getLogManager().reset(); } -- 2.11.0