Repository: logging-log4j2 Updated Branches: refs/heads/master d7871ca64 -> 78adf687b
LOG4J2-1668 make MarkerPatternConverter garbage-free Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/78adf687 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/78adf687 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/78adf687 Branch: refs/heads/master Commit: 78adf687b8ccbd2e626ce3cb063a24c16f879818 Parents: d7871ca Author: rpopma <[email protected]> Authored: Sun Nov 6 20:26:33 2016 +0900 Committer: rpopma <[email protected]> Committed: Sun Nov 6 20:26:33 2016 +0900 ---------------------------------------------------------------------- .../java/org/apache/logging/log4j/MarkerManager.java | 13 ++++++++++--- .../log4j/core/pattern/MarkerPatternConverter.java | 5 +++-- .../logging/log4j/core/GcFreeLoggingTestUtil.java | 7 ++++++- log4j-core/src/test/resources/gcFreeLogging.xml | 6 +++--- .../src/test/resources/gcFreeMixedSyncAsyncLogging.xml | 6 +++--- src/changes/changes.xml | 3 +++ 6 files changed, 28 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java b/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java index a8c7756..8843883 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/MarkerManager.java @@ -21,6 +21,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.logging.log4j.util.PerformanceSensitive; +import org.apache.logging.log4j.util.StringBuilderFormattable; /** * Applications create Markers by using the Marker Manager. All Markers created by this Manager are immutable. @@ -110,7 +111,7 @@ public final class MarkerManager { * is moved to this package and would of course stay in its current module.</em> * </p> */ - public static class Log4jMarker implements Marker { + public static class Log4jMarker implements Marker, StringBuilderFormattable { private static final long serialVersionUID = 100L; @@ -364,12 +365,18 @@ public final class MarkerManager { @Override public String toString() { // FIXME: might want to use an initial capacity; the default is 16 (or str.length() + 16) - final StringBuilder sb = new StringBuilder(name); + final StringBuilder sb = new StringBuilder(); + formatTo(sb); + return sb.toString(); + } + + @Override + public void formatTo(final StringBuilder sb) { + sb.append(name); final Marker[] localParents = parents; if (localParents != null) { addParentInfo(sb, localParents); } - return sb.toString(); } @PerformanceSensitive("allocation") http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java index af29f06..c3c4857 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MarkerPatternConverter.java @@ -19,9 +19,10 @@ package org.apache.logging.log4j.core.pattern; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.util.StringBuilders; /** - * Returns events' full maker string in a StringBuilder. + * Returns events' full marker string in a StringBuilder. */ @Plugin(name = "MarkerPatternConverter", category = PatternConverter.CATEGORY) @ConverterKeys({ "marker" }) @@ -52,7 +53,7 @@ public final class MarkerPatternConverter extends LogEventPatternConverter { public void format(final LogEvent event, final StringBuilder toAppendTo) { final Marker marker = event.getMarker(); if (marker != null) { - toAppendTo.append(marker.toString()); + StringBuilders.appendValue(toAppendTo, marker); } } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java index 51a0b96..2136fc4 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/GcFreeLoggingTestUtil.java @@ -28,6 +28,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; import org.apache.logging.log4j.ThreadContext; import org.apache.logging.log4j.core.util.Constants; @@ -54,7 +55,11 @@ public class GcFreeLoggingTestUtil { assertFalse("Constants.IS_WEB_APP", Constants.IS_WEB_APP); final MyCharSeq myCharSeq = new MyCharSeq(); - MarkerManager.getMarker("test"); // initial creation, value is cached + final Marker test = MarkerManager.getMarker("test"); // initial creation, value is cached + final Marker testParent = MarkerManager.getMarker("testParent"); + final Marker testGrandParent = MarkerManager.getMarker("testGrandParent"); + testParent.addParents(testGrandParent); + test.addParents(testParent); // initialize LoggerContext etc. // This is not steady-state logging and will allocate objects. http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/log4j-core/src/test/resources/gcFreeLogging.xml ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/resources/gcFreeLogging.xml b/log4j-core/src/test/resources/gcFreeLogging.xml index b677dd0..41101eb 100644 --- a/log4j-core/src/test/resources/gcFreeLogging.xml +++ b/log4j-core/src/test/resources/gcFreeLogging.xml @@ -6,13 +6,13 @@ </Console> <File name="File" fileName="target/gcfreefile.log" bufferedIO="false"> <PatternLayout> - <Pattern>%d{DEFAULT}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern> + <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern> </PatternLayout> </File> <RollingFile name="RollingFile" fileName="target/gcfreeRollingFile.log" filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz"> <PatternLayout> - <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern> + <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicy size="50M" /> @@ -20,7 +20,7 @@ </RollingFile> <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAF.log" immediateFlush="false" append="false"> <PatternLayout> - <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern> + <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern> </PatternLayout> </RandomAccessFile> <RollingRandomAccessFile name="RollingRandomAccessFile" http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml index fbdafeb..62a7885 100644 --- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml +++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml @@ -6,13 +6,13 @@ </Console> <File name="File" fileName="target/gcfreefileMixed.log" bufferedIO="false"> <PatternLayout> - <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern> + <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss,SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern> </PatternLayout> </File> <RollingFile name="RollingFile" fileName="target/gcfreeRollingFileMixed.log" filePattern="target/gcfree-%d{MM-dd-yy-HH-mm-ss}.log.gz"> <PatternLayout> - <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern> + <Pattern>%d{yyyy-MM-dd'T'HH:mm:ss.SSS}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %m%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n}</Pattern> </PatternLayout> <Policies> <SizeBasedTriggeringPolicy size="50M" /> @@ -20,7 +20,7 @@ </RollingFile> <RandomAccessFile name="RandomAccessFile" fileName="target/gcfreeRAFMixed.log" immediateFlush="false" append="false"> <PatternLayout> - <Pattern>%d{DEFAULT}{UTC} %r %sn %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern> + <Pattern>%d{DEFAULT}{UTC} %r %sn %marker %markerSimpleName %p %c{1.} [%t] %X{aKey} %m %ex%n %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n}</Pattern> </PatternLayout> </RandomAccessFile> <RollingRandomAccessFile name="RollingRandomAccessFile" http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/78adf687/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 6602d98..72be3fa 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -24,6 +24,9 @@ </properties> <body> <release version="2.8" date="2016-MM-DD" description="GA Release 2.8"> + <action issue="LOG4J2-1668" dev="rpopma" type="fix"> + (GC) Avoid allocating temporary objects in MarkerPatternConverter. + </action> <action issue="LOG4J2-1667" dev="rpopma" type="fix"> (GC) Avoid allocating temporary objects in SequenceNumberPatternConverter. </action>
