Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=48421
authormarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Tue, 12 Jan 2010 19:06:48 +0000 (19:06 +0000)
committermarkt <markt@13f79535-47bb-0310-9956-ffa450edef68>
Tue, 12 Jan 2010 19:06:48 +0000 (19:06 +0000)
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
java/org/apache/juli/logging/LogFactory.java

index 32effe8..96ddf17 100644 (file)
@@ -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
 
 
index a433734..09d7e27 100644 (file)
@@ -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();
     }