You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by rg...@apache.org on 2010/10/24 19:54:51 UTC

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

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: log4j-dev-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-dev-help@logging.apache.org