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)
