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..fa6e3d1 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 @@ /** * Initial converter for pattern. */ - private final List formatters; + private final PatternFormatter[] formatters; + + private static ThreadLocal strBuilder = new ThreadLocal() { + @Override + protected StringBuilder initialValue() { + return new StringBuilder(1024); + } + }; /** * Conversion pattern. @@ -127,8 +134,9 @@ this.noConsoleNoAnsi = noConsoleNoAnsi; final PatternParser parser = createPatternParser(config); try { - this.formatters = parser.parse(pattern == null ? DEFAULT_CONVERSION_PATTERN : pattern, + List 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,12 @@ */ @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 StringBuilder buf = new StringBuilder(1024); + final int len = formatters.length; + for (int i = 0; i < len; i++) { + formatters[i].format(event, buf); } String str = buf.toString(); if (replace != null) {