You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/02/17 14:51:38 UTC

svn commit: r910974 - in /tomcat/trunk/java/org/apache: catalina/startup/Catalina.java juli/ClassLoaderLogManager.java

Author: markt
Date: Wed Feb 17 13:51:37 2010
New Revision: 910974

URL: http://svn.apache.org/viewvc?rev=910974&view=rev
Log:
Improve logging behaviour when shutdown occurs via a shutdownhook. If present, use Catalina's shutdown hook to shutdown Tomcat and JULI. This enables them to be shutdown in the correct order.

Modified:
    tomcat/trunk/java/org/apache/catalina/startup/Catalina.java
    tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java

Modified: tomcat/trunk/java/org/apache/catalina/startup/Catalina.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/Catalina.java?rev=910974&r1=910973&r2=910974&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/startup/Catalina.java (original)
+++ tomcat/trunk/java/org/apache/catalina/startup/Catalina.java Wed Feb 17 13:51:37 2010
@@ -28,11 +28,13 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.logging.LogManager;
 
 import org.apache.catalina.Container;
 import org.apache.catalina.Lifecycle;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.core.StandardServer;
+import org.apache.juli.ClassLoaderLogManager;
 import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomcat.util.digester.Rule;
 import org.xml.sax.Attributes;
@@ -572,6 +574,15 @@
                     shutdownHook = new CatalinaShutdownHook();
                 }
                 Runtime.getRuntime().addShutdownHook(shutdownHook);
+                
+                // If JULI is being used, disable JULI's shutdown hook since
+                // shutdown hooks run in parallel and log messages may be lost
+                // if JULI's hook completes before the CatalinaShutdownHook()
+                LogManager logManager = LogManager.getLogManager();
+                if (logManager instanceof ClassLoaderLogManager) {
+                    ((ClassLoaderLogManager) logManager).setUseShutdownHook(
+                            false);
+                }
             }
         } catch (Throwable t) {
             // This will fail on JDK 1.2. Ignoring, as Tomcat can run
@@ -652,6 +663,13 @@
                 Catalina.this.stop();
             }
             
+            // If JULI is used, shut JULI down *after* the server shuts down
+            // so log messages aren't lost
+            LogManager logManager = LogManager.getLogManager();
+            if (logManager instanceof ClassLoaderLogManager) {
+                ((ClassLoaderLogManager) logManager).shutdown();
+            }
+
         }
 
     }

Modified: tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java?rev=910974&r1=910973&r2=910974&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java (original)
+++ tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java Wed Feb 17 13:51:37 2010
@@ -50,25 +50,8 @@
         
         @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
-                }
+            if (useShutdownHook) {
+                shutdown();
             }
         }
 
@@ -105,7 +88,29 @@
      */
     protected ThreadLocal<String> prefix = new ThreadLocal<String>();
 
+
+    /**
+     * Determines if the shutdown hook is used to perform any necessary
+     * clean-up such as flushing buffered handlers on JVM shutdown. Defaults to
+     * <code>true</code> but may be set to false if another component ensures
+     * that 
+     */
+    protected boolean useShutdownHook = true;
+
     
+    // ------------------------------------------------------------- Properties
+
+
+    public boolean isUseShutdownHook() {
+        return useShutdownHook;
+    }
+
+
+    public void setUseShutdownHook(boolean useShutdownHook) {
+        this.useShutdownHook = useShutdownHook;
+    }
+
+
     // --------------------------------------------------------- Public Methods
 
 
@@ -294,7 +299,35 @@
         readConfiguration(is, Thread.currentThread().getContextClassLoader());
     
     }
+
+
+    /**
+     * Shuts down the logging system.
+     */
+    public void shutdown() {
+        // 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 Methods
+    private void resetLogger(Logger logger) {
         
+        Handler[] handlers = logger.getHandlers();
+        for (Handler handler : handlers) {
+            logger.removeHandler(handler);
+            try {
+                handler.close();
+            } catch (Exception e) {
+                // Ignore
+            }
+        }
+    }
+
     // ------------------------------------------------------ Protected Methods
 
 



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