You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2015/11/02 15:32:38 UTC
[12/45] logging-log4j2 git commit: LOG4J2-1176: ConsoleAppender
created for DefaultConfiguration should avoid sharing OutputStreamManager
instances
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 <rp...@apache.org>
Authored: Sun Nov 1 23:22:21 2015 +0900
Committer: rpopma <rp...@apache.org>
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)