LOG4J2-1176: ConsoleAppender created for DefaultConfiguration should
avoid sharing OutputStreamManager instances

Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/38107ece
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/38107ece
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/38107ece

Branch: refs/heads/LOG4J-1181
Commit: 38107ecee3f16973edef5b6e94f337b071102e4a
Parents: abc0f94
Author: rpopma <[email protected]>
Authored: Sun Nov 1 23:22:21 2015 +0900
Committer: rpopma <[email protected]>
Committed: Sun Nov 1 23:22:21 2015 +0900

----------------------------------------------------------------------
 .../logging/log4j/core/appender/ConsoleAppender.java  | 14 +++++++++++++-
 .../log4j/core/config/AbstractConfiguration.java      |  3 ++-
 2 files changed, 15 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/38107ece/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
index c4e8215..0466485 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/ConsoleAppender.java
@@ -23,6 +23,7 @@ import java.io.Serializable;
 import java.io.UnsupportedEncodingException;
 import java.lang.reflect.Constructor;
 import java.nio.charset.Charset;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.Layout;
@@ -54,6 +55,7 @@ public final class ConsoleAppender extends 
AbstractOutputStreamAppender<OutputSt
     private static final String JANSI_CLASS = 
"org.fusesource.jansi.WindowsAnsiOutputStream";
     private static ConsoleManagerFactory factory = new ConsoleManagerFactory();
     private static final Target DEFAULT_TARGET = Target.SYSTEM_OUT;
+    private static final AtomicInteger COUNT = new AtomicInteger();
 
     /**
      * Enumeration of console destinations.
@@ -104,7 +106,8 @@ public final class ConsoleAppender extends 
AbstractOutputStreamAppender<OutputSt
 
     public static ConsoleAppender createDefaultAppenderForLayout(final 
Layout<? extends Serializable> layout) {
         // this method cannot use the builder class without introducing an 
infinite loop due to DefaultConfiguration
-        return new ConsoleAppender("Console", layout, null, 
getManager(DEFAULT_TARGET, false, layout), true);
+        return new ConsoleAppender("DefaultConsole-" + 
COUNT.incrementAndGet(), layout, null,
+                getDefaultManager(DEFAULT_TARGET, false, layout), true);
     }
 
     @PluginBuilderFactory
@@ -174,6 +177,15 @@ public final class ConsoleAppender extends 
AbstractOutputStreamAppender<OutputSt
         }
     }
 
+    private static OutputStreamManager getDefaultManager(final Target target, 
final boolean follow,
+            final Layout<? extends Serializable> layout) {
+        final OutputStream os = getOutputStream(follow, target);
+
+        // LOG4J2-1176 DefaultConfiguration should not share 
OutputStreamManager instances to avoid memory leaks.
+        final String managerName = target.name() + '.' + follow + "-" + 
COUNT.get();
+        return OutputStreamManager.getManager(managerName, new FactoryData(os, 
managerName, layout), factory);
+    }
+
     private static OutputStreamManager getManager(final Target target, final 
boolean follow,
             final Layout<? extends Serializable> layout) {
         final OutputStream os = getOutputStream(follow, target);

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/38107ece/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
----------------------------------------------------------------------
diff --git 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
index 380a37e..fec1985 100644
--- 
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
+++ 
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AbstractConfiguration.java
@@ -501,7 +501,8 @@ public abstract class AbstractConfiguration extends 
AbstractFilterable implement
     }
 
     protected void setToDefault() {
-        setName(DefaultConfiguration.DEFAULT_NAME);
+        // LOG4J2-1176 facilitate memory leak investigation
+        setName(DefaultConfiguration.DEFAULT_NAME + "@" + 
Integer.toHexString(hashCode()));
         final Layout<? extends Serializable> layout = 
PatternLayout.newBuilder()
                 .withPattern(DefaultConfiguration.DEFAULT_PATTERN)
                 .withConfiguration(this)

Reply via email to