Repository: logging-log4j2 Updated Branches: refs/heads/LOG4J2-1121B-ReliabilityStrategy beb9e8c3c -> 63323d586
LOG4J2-1125 PatternLayout performance improvement by caching and reusing a ThreadLocal StringBuilder. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/8025bb18 Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/8025bb18 Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/8025bb18 Branch: refs/heads/LOG4J2-1121B-ReliabilityStrategy Commit: 8025bb18ce4444b76822a7965776bb075bd52aa9 Parents: 01d11a7 Author: rpopma <[email protected]> Authored: Sun Sep 20 09:09:07 2015 +0200 Committer: rpopma <[email protected]> Committed: Sun Sep 20 09:09:07 2015 +0200 ---------------------------------------------------------------------- .../log4j/core/layout/PatternLayout.java | 20 +++++++++++++++----- src/changes/changes.xml | 3 +++ 2 files changed, 18 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8025bb18/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java index fb4bfcd..a8092ff 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/layout/PatternLayout.java @@ -84,7 +84,14 @@ public final class PatternLayout extends AbstractStringLayout { /** * Initial converter for pattern. */ - private final List<PatternFormatter> formatters; + private final PatternFormatter[] formatters; + + private static ThreadLocal<StringBuilder> strBuilder = new ThreadLocal<StringBuilder>() { + @Override + protected StringBuilder initialValue() { + return new StringBuilder(1024); + } + }; /** * Conversion pattern. @@ -127,8 +134,9 @@ public final class PatternLayout extends AbstractStringLayout { this.noConsoleNoAnsi = noConsoleNoAnsi; final PatternParser parser = createPatternParser(config); try { - this.formatters = parser.parse(pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, + List<PatternFormatter> list = parser.parse(pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, this.alwaysWriteExceptions, this.noConsoleNoAnsi); + this.formatters = list.toArray(new PatternFormatter[0]); } catch (RuntimeException ex) { throw new IllegalArgumentException("Cannot parse pattern '" + pattern + "'", ex); } @@ -189,9 +197,11 @@ public final class PatternLayout extends AbstractStringLayout { */ @Override public String toSerializable(final LogEvent event) { - final StringBuilder buf = new StringBuilder(1024); - for (final PatternFormatter formatter : formatters) { - formatter.format(event, buf); + final StringBuilder buf = strBuilder.get(); + buf.setLength(0); + final int len = formatters.length; + for (int i = 0; i < len; i++) { + formatters[i].format(event, buf); } String str = buf.toString(); if (replace != null) { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/8025bb18/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 3779165..2266565 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -63,6 +63,9 @@ <action issue="LOG4J2-1120" dev="rpopma" type="update"> LoggerConfig performance improvements: avoid unnecessary lock acquisition, use more efficient data structure. </action> + <action issue="LOG4J2-1125" dev="rpopma" type="update"> + PatternLayout performance improvement by caching and reusing a ThreadLocal StringBuilder. + </action> <action issue="LOG4J2-1114" dev="ggregory" type="update"> Add thread name to status logger layout. </action>
