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