Author: rgoers
Date: Sun Oct 23 17:04:35 2011
New Revision: 1187931
URL: http://svn.apache.org/viewvc?rev=1187931&view=rev
Log:
Prevent endless recursion when a configuration component uses a Logger
Added:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
- copied, changed from r1165682,
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LogEventFactory.java
Removed:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LogEventFactory.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/main/java/org/apache/logging/log4j/
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/ContextListener.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/JNDIContextFilter.java
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java?rev=1187931&r1=1187930&r2=1187931&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LoggerContext.java
Sun Oct 23 17:04:35 2011
@@ -19,6 +19,7 @@ package org.apache.logging.log4j.core;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.ConfigurationFactory;
import org.apache.logging.log4j.core.config.ConfigurationListener;
+import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.config.NullConfiguration;
import org.apache.logging.log4j.status.StatusLogger;
@@ -32,7 +33,7 @@ import java.util.concurrent.ConcurrentMa
* applications and a reference to the Configuration. The Configuration will
contain the configured loggers, appenders,
* filters, etc and will be atomically updated whenever a reconfigure occurs.
*/
-public class LoggerContext implements
org.apache.logging.log4j.spi.LoggerContext, ConfigurationListener {
+public class LoggerContext implements
org.apache.logging.log4j.spi.LoggerContext, ConfigurationListener, Lifecycle {
private static StatusLogger logger = StatusLogger.getLogger();
@@ -42,7 +43,7 @@ public class LoggerContext implements or
* The Configuration is volatile to guarantee that initialization of the
Configuration has completed before
* the reference is updated.
*/
- private volatile Configuration config;
+ private volatile Configuration config = new DefaultConfiguration();
private Object externalContext = null;
@@ -50,6 +51,8 @@ public class LoggerContext implements or
private final URI configLocation;
+ private boolean isStarted;
+
/**
* Constructor taking only a name.
* @param name The context name.
@@ -77,7 +80,6 @@ public class LoggerContext implements or
contextName = name;
this.externalContext = externalContext;
this.configLocation = configLocn;
- reconfigure();
}
/**
@@ -101,7 +103,22 @@ public class LoggerContext implements or
} else {
configLocation = null;
}
+ }
+
+ public void start() {
reconfigure();
+ isStarted = true;
+ }
+
+ public synchronized void stop() {
+ isStarted = false;
+ updateLoggers(new NullConfiguration());
+ config.stop();
+ externalContext = null;
+ }
+
+ public boolean isStarted() {
+ return isStarted;
}
/**
@@ -172,15 +189,6 @@ public class LoggerContext implements or
}
/**
- * Shutdown the logging system.
- */
- public synchronized void shutdown() {
- updateLoggers(new NullConfiguration());
- config.stop();
- externalContext = null;
- }
-
- /**
* Set the Configuration to be used.
* @param config The new Configuration.
* @return The previous Configuration.
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java?rev=1187931&r1=1187930&r2=1187931&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/LoggerConfig.java
Sun Oct 23 17:04:35 2011
@@ -23,7 +23,7 @@ import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Appender;
import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.core.LogEvent;
-import org.apache.logging.log4j.core.LogEventFactory;
+import org.apache.logging.log4j.core.impl.LogEventFactory;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttr;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java?rev=1187931&r1=1187930&r2=1187931&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/Log4jContextFactory.java
Sun Oct 23 17:04:35 2011
@@ -17,6 +17,7 @@
package org.apache.logging.log4j.core.impl;
import org.apache.logging.log4j.core.LoggerContext;
+import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.helpers.Constants;
import org.apache.logging.log4j.core.helpers.Loader;
import org.apache.logging.log4j.core.selector.ClassLoaderContextSelector;
@@ -33,6 +34,8 @@ public class Log4jContextFactory impleme
private StatusLogger logger = StatusLogger.getLogger();
+ private ThreadLocal<Log4jContextFactory> recursive = new
ThreadLocal<Log4jContextFactory>();
+
public Log4jContextFactory() {
String sel = System.getProperty(Constants.LOG4J_CONTEXT_SELECTOR);
if (sel != null) {
@@ -55,7 +58,18 @@ public class Log4jContextFactory impleme
}
public LoggerContext getContext(String fqcn, boolean currentContext) {
- return selector.getContext(fqcn, currentContext);
-
+ LoggerContext ctx = selector.getContext(fqcn, currentContext);
+ synchronized (ctx) {
+ if (recursive.get() != null || ctx.isStarted()) {
+ return ctx;
+ }
+ try {
+ recursive.set(this);
+ ctx.start();
+ return ctx;
+ } finally {
+ recursive.remove();
+ }
+ }
}
}
Copied:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
(from r1165682,
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LogEventFactory.java)
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java?p2=logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java&p1=logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LogEventFactory.java&r1=1165682&r2=1187931&rev=1187931&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/LogEventFactory.java
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/impl/LogEventFactory.java
Sun Oct 23 17:04:35 2011
@@ -15,10 +15,11 @@
* limitations under the license.
*/
-package org.apache.logging.log4j.core;
+package org.apache.logging.log4j.core.impl;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
+import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.message.Message;
/**
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/ContextListener.java
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/ContextListener.java?rev=1187931&r1=1187930&r2=1187931&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/ContextListener.java
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/ContextListener.java
Sun Oct 23 17:04:35 2011
@@ -42,7 +42,7 @@ public class ContextListener implements
LoggerContext ctx = (LoggerContext)
context.getAttribute(LOG4J_CONTEXT_ATTRIBUTE);
if (ctx != null) {
context.removeAttribute(LOG4J_CONTEXT_ATTRIBUTE);
- ctx.shutdown();
+ ctx.stop();
}
}
}
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/JNDIContextFilter.java
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/JNDIContextFilter.java?rev=1187931&r1=1187930&r2=1187931&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/JNDIContextFilter.java
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/javaee/JNDIContextFilter.java
Sun Oct 23 17:04:35 2011
@@ -96,7 +96,7 @@ public class JNDIContextFilter implement
if (selector != null) {
selector.removeContext(name);
}
- ctx.shutdown();
+ ctx.stop();
}
}
}
Modified:
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml
URL:
http://svn.apache.org/viewvc/logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml?rev=1187931&r1=1187930&r2=1187931&view=diff
==============================================================================
---
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml
(original)
+++
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/slf4j-impl/src/test/resources/log4j-test1.xml
Sun Oct 23 17:04:35 2011
@@ -22,6 +22,7 @@
<List name="List">
<PatternLayout pattern="%C{1.} %m MDC%X%n"/>
</List>
+ <SLF4J name="SLF4J"/>
</appenders>
<loggers>