From 9ef40edc7521a5ba3380318adaad40797f9b7a63 Mon Sep 17 00:00:00 2001 From: Richard Zschech Date: Fri, 22 Jul 2016 20:54:53 -0400 Subject: [PATCH] LOG4J2-1341 GC-free HighlightConverter and StyleConverter --- .../core/pattern/HighlightConverter.java | 26 +++++++++++++------ .../log4j/core/pattern/StyleConverter.java | 24 +++++++++++------ .../src/test/resources/gcFreeLogging.xml | 10 +++---- .../resources/gcFreeMixedSyncAsyncLogging.xml | 10 +++---- log4j-core/src/test/resources/log4j-style.xml | 4 +-- src/site/xdoc/manual/garbagefree.xml | 10 ++++++- 6 files changed, 55 insertions(+), 29 deletions(-) diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java index 0e2f63dece3..a3a31ab22b1 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/HighlightConverter.java @@ -193,6 +193,8 @@ public static HighlightConverter newInstance(final Configuration config, final S private final boolean noAnsi; + private final String defaultStyle; + /** * Construct the converter. * @@ -205,6 +207,7 @@ private HighlightConverter(final List patternFormatters, final super("style", "style"); this.patternFormatters = patternFormatters; this.levelStyles = levelStyles; + this.defaultStyle = AnsiEscape.getDefaultStyle(); this.noAnsi = noAnsi; } @@ -213,17 +216,24 @@ private HighlightConverter(final List patternFormatters, final */ @Override public void format(final LogEvent event, final StringBuilder toAppendTo) { - final StringBuilder buf = new StringBuilder(); - for (final PatternFormatter formatter : patternFormatters) { - formatter.format(event, buf); + int start = 0; + int end = 0; + if (!noAnsi) { + start = toAppendTo.length(); + toAppendTo.append(levelStyles.get(event.getLevel())); + end = toAppendTo.length(); + } + + //noinspection ForLoopReplaceableByForEach + for (int i = 0, size = patternFormatters.size(); i < size; i++) { + patternFormatters.get(i).format(event, toAppendTo); } - if (buf.length() > 0) { - if (noAnsi) { - toAppendTo.append(buf.toString()); + if (!noAnsi) { + if (toAppendTo.length() == end) { + toAppendTo.setLength(start); } else { - toAppendTo.append(levelStyles.get(event.getLevel())).append(buf.toString()). - append(AnsiEscape.getDefaultStyle()); + toAppendTo.append(defaultStyle); } } } diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java index 202d77189d2..6d73b3b0eab 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/StyleConverter.java @@ -94,17 +94,25 @@ public static StyleConverter newInstance(final Configuration config, final Strin */ @Override public void format(final LogEvent event, final StringBuilder toAppendTo) { - final StringBuilder buf = new StringBuilder(); - for (final PatternFormatter formatter : patternFormatters) { - formatter.format(event, buf); + int start = 0; + int end = 0; + if (!noAnsi) { + start = toAppendTo.length(); + toAppendTo.append(style); + end = toAppendTo.length(); } - if (buf.length() > 0) { - if (noAnsi) { - // faster to test and do this than setting style and defaultStyle to empty strings. - toAppendTo.append(buf.toString()); + //noinspection ForLoopReplaceableByForEach + for (int i = 0, size = patternFormatters.size(); i < size; i++) { + patternFormatters.get(i).format(event, toAppendTo); + } + + if (!noAnsi) { + if (toAppendTo.length() == end) { + toAppendTo.setLength(start); } else { - toAppendTo.append(style).append(buf.toString()).append(defaultStyle); + // faster to test and do this than setting style and defaultStyle to empty strings. + toAppendTo.append(defaultStyle); } } } diff --git a/log4j-core/src/test/resources/gcFreeLogging.xml b/log4j-core/src/test/resources/gcFreeLogging.xml index f90d754b14d..889346693a6 100644 --- a/log4j-core/src/test/resources/gcFreeLogging.xml +++ b/log4j-core/src/test/resources/gcFreeLogging.xml @@ -6,13 +6,13 @@ - %d %p %c{1.} [%t] %m%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n} - %d %p %c{1.} [%t] %m%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n} @@ -20,7 +20,7 @@ - %d %p %c{1.} [%t] %X{aKey} %m %ex%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n} - %d %p %c{1.} [%t] %X{aKey} %m %location %ex%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %location %ex%n} @@ -38,7 +38,7 @@ fileName="target/gcfreemmap.log" immediateFlush="false" append="false"> - %d %p %c{1.} [%t] %X{aKey} %m%ex%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m%ex%n} diff --git a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml index e4c00009f17..50bff5780c7 100644 --- a/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml +++ b/log4j-core/src/test/resources/gcFreeMixedSyncAsyncLogging.xml @@ -6,13 +6,13 @@ - %d %p %c{1.} [%t] %m%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n} - %d %p %c{1.} [%t] %m%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %m%n} @@ -20,7 +20,7 @@ - %d %p %c{1.} [%t] %X{aKey} %m %ex%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %ex%n} - %d %p %c{1.} [%t] %X{aKey} %m %location %ex%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m %location %ex%n} @@ -38,7 +38,7 @@ fileName="target/gcfreemmapMixed.log" immediateFlush="false" append="false"> - %d %p %c{1.} [%t] %X{aKey} %m%ex%n + %highlight{%style{%d}{bright,cyan} %p %c{1.} [%t] %X{aKey} %m%ex%n} diff --git a/log4j-core/src/test/resources/log4j-style.xml b/log4j-core/src/test/resources/log4j-style.xml index 9b18b37c460..6acf8730a45 100644 --- a/log4j-core/src/test/resources/log4j-style.xml +++ b/log4j-core/src/test/resources/log4j-style.xml @@ -20,7 +20,7 @@ - %d %highlight{%p} %style{%logger}{bright,cyan} %C{1.} %msg%n + %d %highlight{%p} %style{%logger}{bright,cyan}%style{}{bright,cyan} %C{1.} %msg%n @@ -31,4 +31,4 @@ - \ No newline at end of file + diff --git a/src/site/xdoc/manual/garbagefree.xml b/src/site/xdoc/manual/garbagefree.xml index 58ca1d045cf..969a947ac88 100644 --- a/src/site/xdoc/manual/garbagefree.xml +++ b/src/site/xdoc/manual/garbagefree.xml @@ -233,6 +233,14 @@ + + %hightlight{pattern}{style} + Adds ANSI colors (unless child pattern is not garbage free) + + + style{pattern}{ANSI style} + Style the message (unless child pattern is not garbage free) + %m, %msg, %message Log message (unless message text contains '${') @@ -501,4 +509,4 @@ public void garbageFree() { - \ No newline at end of file +