Repository: logging-log4j2 Updated Branches: refs/heads/master c696e8055 -> 0049d85a4
[LOG4J2-1216] Nested pattern layout options broken. Apply slightly tweaked patch for formatting. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/0049d85a Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/0049d85a Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/0049d85a Branch: refs/heads/master Commit: 0049d85a4c789974ea6354d390ba65173db8937a Parents: c696e80 Author: Barna Zsombor Klara <[email protected]> Authored: Tue Oct 10 16:24:31 2017 -0600 Committer: Gary Gregory <[email protected]> Committed: Tue Oct 10 16:24:31 2017 -0600 ---------------------------------------------------------------------- .../log4j/core/pattern/PatternParser.java | 37 +++++++++----------- .../log4j/core/pattern/PatternParserTest.java | 20 ++++++++++- src/changes/changes.xml | 3 ++ 3 files changed, 38 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0049d85a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java index 065ab9c..5260b11 100644 --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/PatternParser.java @@ -272,31 +272,26 @@ public final class PatternParser { private static int extractOptions(final String pattern, final int start, final List<String> options) { int i = start; while (i < pattern.length() && pattern.charAt(i) == '{') { - final int begin = i++; - int end; - int depth = 0; - do { - end = pattern.indexOf('}', i); - if (end == -1) { - break; - } - final int next = pattern.indexOf("{", i); - if (next != -1 && next < end) { - i = end + 1; - ++depth; - } else if (depth > 0) { - --depth; + i++; // skip opening "{" + final int begin = i; // position of first real char + int depth = 1; // already inside one level + while (depth > 0 && i < pattern.length()) { + char c = pattern.charAt(i); + if (c == '{') { + depth++; + } else if (c == '}') { + depth--; + // TODO(?) maybe escaping of { and } with \ or % } - } while (depth > 0); + i++; + } // while - if (end == -1) { - break; + if (depth > 0) { // option not closed, continue with pattern after closing bracket + return pattern.indexOf('}', start) + 1; } - final String r = pattern.substring(begin + 1, end); - options.add(r); - i = end + 1; - } + options.add(pattern.substring(begin, i - 1)); + } // while return i; } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0049d85a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java ---------------------------------------------------------------------- diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java index 1e4cd92..1b68c0d 100644 --- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java +++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/PatternParserTest.java @@ -54,6 +54,7 @@ public class PatternParserTest { private final String mdcMsgPattern3 = "%m : %X{key2}%n"; private final String mdcMsgPattern4 = "%m : %X{key3}%n"; private final String mdcMsgPattern5 = "%m : %X{key1},%X{key2},%X{key3}%n"; + private final String deeplyNestedPattern = "%notEmpty{ %maxLen{%X{var}}{3} }"; private static String badPattern = "[%d{yyyyMMdd HH:mm:ss,SSS] %-5p [%c{10}] - %m%n"; private static String customPattern = "[%d{yyyyMMdd HH:mm:ss,SSS}] %-5p [%-25.25c{1}:%-4L] - %m%n"; @@ -114,7 +115,7 @@ public class PatternParserTest { formatter.format(event, buf); } final String str = buf.toString(); - final String expected = "INFO [PatternParserTest :100 ] - Hello, world" + Strings.LINE_SEPARATOR; + final String expected = "INFO [PatternParserTest :101 ] - Hello, world" + Strings.LINE_SEPARATOR; assertTrue("Expected to end with: " + expected + ". Actual: " + str, str.endsWith(expected)); } @@ -332,4 +333,21 @@ public class PatternParserTest { pp.parse("%N"); assertTrue(config.getNanoClock() instanceof SystemNanoClock); } + + @Test + public void testDeeplyNestedPattern() { + final List<PatternFormatter> formatters = parser.parse(deeplyNestedPattern); + assertNotNull(formatters); + assertEquals(1, formatters.size()); + + final Map<String, String> mdc = new HashMap<>(); + mdc.put("var", "1234"); + final Log4jLogEvent event = Log4jLogEvent.newBuilder() // + .setContextMap(mdc).build(); + final StringBuilder buf = new StringBuilder(); + formatters.get(0).format(event, buf); + final String expected = " 123 "; + assertEquals(expected, buf.toString()); + + } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/0049d85a/src/changes/changes.xml ---------------------------------------------------------------------- diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 578cc6d..d73d54c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -62,6 +62,9 @@ <action issue="LOG4J2-2053" dev="ggregory" type="fix"> Exception java.nio.charset.UnsupportedCharsetException: cp65001 in 2.9.0. </action> + <action issue="LOG4J2-1216" dev="ggregory" type="fix" due-to="Thies Wellpott, Barna Zsombor Klara"> + Nested pattern layout options broken. + </action> </release> <release version="2.9.1" date="2017-09-17" description="GA Release 2.9.1"> <action issue="LOG4J2-1988" dev="rpopma" type="fix">
