Author: rgoers
Date: Sun Oct 24 17:54:50 2010
New Revision: 1026847

URL: http://svn.apache.org/viewvc?rev=1026847&view=rev
Log:
Prevent recursive appender calls

Modified:
    
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java

Modified: 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.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/AppenderControl.java?rev=1026847&r1=1026846&r2=1026847&view=diff
==============================================================================
--- 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
 (original)
+++ 
logging/log4j/branches/BRANCH_2_0_EXPERIMENTAL/rgoers/log4j2-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
 Sun Oct 24 17:54:50 2010
@@ -24,10 +24,12 @@ import org.apache.logging.log4j.core.app
 import org.apache.logging.log4j.core.appender.DefaultErrorHandler;
 
 /**
- *
+ * Wraps appenders with details the appender implementation shouldn't need to 
know about.
  */
 public class AppenderControl {
 
+    private ThreadLocal<AppenderControl> recursive = new 
ThreadLocal<AppenderControl>();
+
     private final Appender appender;
 
     AppenderControl(Appender appender) {
@@ -39,33 +41,43 @@ public class AppenderControl {
     }
 
     public void callAppender(LogEvent event) {
-        if (!appender.isStarted()) {
-            appender.getHandler().error("Attempted to append to non-started 
appender " + appender.getName());
+        if (recursive.get() != null) {
+            appender.getHandler().error("Recursive call to appender " + 
appender.getName());
+            return;
+        }
+        try {
+            recursive.set(this);
+
+            if (!appender.isStarted()) {
+                appender.getHandler().error("Attempted to append to 
non-started appender " + appender.getName());
 
-            if (!appender.suppressException()) {
-                throw new AppenderRuntimeException("Attempted to append to 
non-started appender " + appender.getName());
+                if (!appender.suppressException()) {
+                    throw new AppenderRuntimeException("Attempted to append to 
non-started appender " + appender.getName());
+                }
             }
-        }
 
-        Filter.Result result = Filter.Result.NEUTRAL;
+            Filter.Result result = Filter.Result.NEUTRAL;
 
-        for (Filter filter : appender.getFilters()) {
-            result = filter.filter(event);
-            if (result != Filter.Result.NEUTRAL) {
-                break;
+            for (Filter filter : appender.getFilters()) {
+                result = filter.filter(event);
+                if (result != Filter.Result.NEUTRAL) {
+                    break;
+                }
+            }
+            if (result == Filter.Result.DENY) {
+                return;
             }
-        }
-        if (result == Filter.Result.DENY) {
-            return;
-        }
 
-        try {
-            appender.append(event);
-        } catch (Exception ex) {
-            appender.getHandler().error("An exception occurred processing 
Appender " + appender.getName(), ex);
-            if (!appender.suppressException()) {
-                throw new AppenderRuntimeException(ex);
+            try {
+                appender.append(event);
+            } catch (Exception ex) {
+                appender.getHandler().error("An exception occurred processing 
Appender " + appender.getName(), ex);
+                if (!appender.suppressException()) {
+                    throw new AppenderRuntimeException(ex);
+                }
             }
+        } finally {
+            recursive.set(null);
         }
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to