You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by kk...@apache.org on 2010/03/04 01:18:44 UTC
svn commit: r918787 -
/tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java
Author: kkolinko
Date: Thu Mar 4 00:18:44 2010
New Revision: 918787
URL: http://svn.apache.org/viewvc?rev=918787&view=rev
Log:
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.
Modified:
tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java
Modified: tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java?rev=918787&r1=918786&r2=918787&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java (original)
+++ tomcat/trunk/java/org/apache/juli/ClassLoaderLogManager.java Thu Mar 4 00:18:44 2010
@@ -300,6 +300,14 @@
}
+ @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 @@
// 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();
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org