You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by mi...@apache.org on 2017/11/11 21:48:07 UTC
[01/12] logging-log4j2 git commit: LOG4J2-2112: MapMessage values use
deep toString
Repository: logging-log4j2
Updated Branches:
refs/heads/master c61f37d7d -> a23a48590
LOG4J2-2112: MapMessage values use deep toString
This allows for more efficient StringBuilder usage and usage of
StringBuilderFormattable MapMessage values.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/99287e87
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/99287e87
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/99287e87
Branch: refs/heads/master
Commit: 99287e87b6fb824526fc040f3fa240974f9754f1
Parents: 16c0b7e
Author: Carter Kozak <c4...@gmail.com>
Authored: Thu Nov 9 11:36:01 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100
----------------------------------------------------------------------
.../logging/log4j/message/MapMessage.java | 17 ++---
.../log4j/message/ParameterFormatter.java | 39 ++---------
.../log4j/message/ReusableObjectMessage.java | 25 +------
.../logging/log4j/util/StringBuilders.java | 9 ++-
.../logging/log4j/message/MapMessageTest.java | 70 ++++++++++++++++++++
5 files changed, 93 insertions(+), 67 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index 57894b8..9f2aeeb 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -213,10 +213,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
*/
public String get(final String key) {
Object result = data.getValue(key);
- if (result == null) {
- return null;
- }
- return String.valueOf(result);
+ return ParameterFormatter.deepToString(result);
}
/**
@@ -347,7 +344,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
.append(data.getKeyAt(i))
.append("\">");
int size = sb.length();
- sb.append(data.<Object>getValueAt(i));
+ ParameterFormatter.recursiveDeepToString(data.getValueAt(i), sb, null);
StringBuilders.escapeXml(sb, size);
sb.append("</Entry>\n");
}
@@ -396,7 +393,9 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
if (i > 0) {
sb.append(' ');
}
- StringBuilders.appendKeyDqValue(sb, data.getKeyAt(i), data.getValueAt(i));
+ sb.append(data.getKeyAt(i)).append(Chars.EQ).append(Chars.DQUOTE);
+ ParameterFormatter.recursiveDeepToString(data.getValueAt(i), sb, null);
+ sb.append(Chars.DQUOTE);
}
}
@@ -412,7 +411,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
StringBuilders.escapeJson(sb, start);
sb.append(Chars.DQUOTE).append(':').append(Chars.DQUOTE);
start = sb.length();
- sb.append(data.<Object>getValueAt(i));
+ ParameterFormatter.recursiveDeepToString(data.getValueAt(i), sb, null);
StringBuilders.escapeJson(sb, start);
sb.append(Chars.DQUOTE);
}
@@ -426,7 +425,9 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStr
if (i > 0) {
sb.append(", ");
}
- StringBuilders.appendKeyDqValue(sb, data.getKeyAt(i), data.getValueAt(i));
+ sb.append(data.getKeyAt(i)).append(Chars.EQ).append(Chars.DQUOTE);
+ ParameterFormatter.recursiveDeepToString(data.getValueAt(i), sb, null);
+ sb.append(Chars.DQUOTE);
}
sb.append('}');
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
index 79c447a..e506d89 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterFormatter.java
@@ -25,6 +25,7 @@ import java.util.Map;
import java.util.Set;
import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util.StringBuilders;
/**
* Supports parameter formatting as used in ParameterizedMessage and ReusableParameterizedMessage.
@@ -395,8 +396,7 @@ final class ParameterFormatter {
return (String) o;
}
final StringBuilder str = new StringBuilder();
- final Set<String> dejaVu = new HashSet<>(); // that's actually a neat name ;)
- recursiveDeepToString(o, str, dejaVu);
+ recursiveDeepToString(o, str, null);
return str.toString();
}
@@ -424,7 +424,7 @@ final class ParameterFormatter {
* @param str the StringBuilder that o will be appended to
* @param dejaVu a list of container identities that were already used.
*/
- private static void recursiveDeepToString(final Object o, final StringBuilder str, final Set<String> dejaVu) {
+ static void recursiveDeepToString(final Object o, final StringBuilder str, final Set<String> dejaVu) {
if (appendSpecialTypes(o, str)) {
return;
}
@@ -436,38 +436,7 @@ final class ParameterFormatter {
}
private static boolean appendSpecialTypes(final Object o, final StringBuilder str) {
- if (o == null || o instanceof String) {
- str.append((String) o);
- return true;
- } else if (o instanceof CharSequence) {
- str.append((CharSequence) o);
- return true;
- } else if (o instanceof StringBuilderFormattable) {
- ((StringBuilderFormattable) o).formatTo(str);
- return true;
- } else if (o instanceof Integer) { // LOG4J2-1415 unbox auto-boxed primitives to avoid calling toString()
- str.append(((Integer) o).intValue());
- return true;
- } else if (o instanceof Long) {
- str.append(((Long) o).longValue());
- return true;
- } else if (o instanceof Double) {
- str.append(((Double) o).doubleValue());
- return true;
- } else if (o instanceof Boolean) {
- str.append(((Boolean) o).booleanValue());
- return true;
- } else if (o instanceof Character) {
- str.append(((Character) o).charValue());
- return true;
- } else if (o instanceof Short) {
- str.append(((Short) o).shortValue());
- return true;
- } else if (o instanceof Float) {
- str.append(((Float) o).floatValue());
- return true;
- }
- return appendDate(o, str);
+ return StringBuilders.appendSpecificTypes(str, o) || appendDate(o, str);
}
private static boolean appendDate(final Object o, final StringBuilder str) {
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
index 69ad3b6..d46e859 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ReusableObjectMessage.java
@@ -18,6 +18,7 @@ package org.apache.logging.log4j.message;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util.StringBuilders;
/**
* Mutable Message wrapper around an Object message.
@@ -46,29 +47,7 @@ public class ReusableObjectMessage implements ReusableMessage {
@Override
public void formatTo(final StringBuilder buffer) {
- if (obj == null || obj instanceof String) {
- buffer.append((String) obj);
- } else if (obj instanceof StringBuilderFormattable) {
- ((StringBuilderFormattable) obj).formatTo(buffer);
- } else if (obj instanceof CharSequence) {
- buffer.append((CharSequence) obj);
- } else if (obj instanceof Integer) { // LOG4J2-1437 unbox auto-boxed primitives to avoid calling toString()
- buffer.append(((Integer) obj).intValue());
- } else if (obj instanceof Long) {
- buffer.append(((Long) obj).longValue());
- } else if (obj instanceof Double) {
- buffer.append(((Double) obj).doubleValue());
- } else if (obj instanceof Boolean) {
- buffer.append(((Boolean) obj).booleanValue());
- } else if (obj instanceof Character) {
- buffer.append(((Character) obj).charValue());
- } else if (obj instanceof Short) {
- buffer.append(((Short) obj).shortValue());
- } else if (obj instanceof Float) {
- buffer.append(((Float) obj).floatValue());
- } else {
- buffer.append(obj);
- }
+ StringBuilders.appendValue(buffer, obj);
}
/**
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
index 1ab0909..c786e30 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
@@ -69,6 +69,12 @@ public final class StringBuilders {
* @param obj the object whose text representation to append to the StringBuilder
*/
public static void appendValue(final StringBuilder stringBuilder, final Object obj) {
+ if (!appendSpecificTypes(stringBuilder, obj)) {
+ stringBuilder.append(obj);
+ }
+ }
+
+ public static boolean appendSpecificTypes(final StringBuilder stringBuilder, final Object obj) {
if (obj == null || obj instanceof String) {
stringBuilder.append((String) obj);
} else if (obj instanceof StringBuilderFormattable) {
@@ -90,8 +96,9 @@ public final class StringBuilders {
} else if (obj instanceof Float) {
stringBuilder.append(((Float) obj).floatValue());
} else {
- stringBuilder.append(obj);
+ return false;
}
+ return true;
}
/**
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/99287e87/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 781d46d..61fda91 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.logging.log4j.message;
+import org.apache.logging.log4j.util.StringBuilderFormattable;
import org.junit.Test;
import java.util.HashMap;
@@ -157,4 +158,73 @@ public class MapMessageTest {
final String expected = "<Map>\n <Entry key=\"key\">1</Entry>\n</Map>";
assertEquals(expected, result);
}
+
+ @Test
+ public void testFormatToUsedInOutputXml() {
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with("key", new FormattableTestType());
+ final String result = msg.getFormattedMessage(new String[]{"XML"});
+ final String expected = "<Map>\n <Entry key=\"key\">formatTo</Entry>\n</Map>";
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testFormatToUsedInOutputJson() {
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with("key", new FormattableTestType());
+ final String result = msg.getFormattedMessage(new String[]{"JSON"});
+ final String expected = "{\"key\":\"formatTo\"}";
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testFormatToUsedInOutputJava() {
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with("key", new FormattableTestType());
+ final String result = msg.getFormattedMessage(new String[]{"JAVA"});
+ final String expected = "{key=\"formatTo\"}";
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testFormatToUsedInOutputDefault() {
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with("key", new FormattableTestType());
+ final String result = msg.getFormattedMessage(null);
+ final String expected = "key=\"formatTo\"";
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testGetUsesDeepToString() {
+ final String key = "key";
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with(key, new FormattableTestType());
+ final String result = msg.get(key);
+ final String expected = "formatTo";
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testRemoveUsesDeepToString() {
+ final String key = "key";
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with(key, new FormattableTestType());
+ final String result = msg.remove(key);
+ final String expected = "formatTo";
+ assertEquals(expected, result);
+ }
+
+ private static final class FormattableTestType implements StringBuilderFormattable {
+
+ @Override
+ public String toString() {
+ return "toString";
+ }
+
+ @Override
+ public void formatTo(StringBuilder buffer) {
+ buffer.append("formatTo");
+ }
+ }
}
[02/12] logging-log4j2 git commit: LOG4J2-2101: MapMessage correctly
handles non-string map values
Posted by mi...@apache.org.
LOG4J2-2101: MapMessage correctly handles non-string map values
Previously formatting non-string values worked, however filtering,
which uess the "get" method would fail due to MapMessage attempting
to cast values to String.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/f0123b1d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f0123b1d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f0123b1d
Branch: refs/heads/master
Commit: f0123b1ddf236c2d1c0b23f005d0cf4f8e9dd6c5
Parents: 23bcd25
Author: Carter Kozak <c4...@gmail.com>
Authored: Mon Nov 6 13:14:36 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100
----------------------------------------------------------------------
.../logging/log4j/message/MapMessage.java | 15 +++++---
.../logging/log4j/message/MapMessageTest.java | 37 ++++++++++++++++++++
2 files changed, 48 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f0123b1d/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index e39774c..649772d 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -200,7 +200,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
* @param map The Map to add.
*/
public void putAll(final Map<String, String> map) {
- for (final Map.Entry<String, ?> entry : map.entrySet()) {
+ for (final Map.Entry<String, String> entry : map.entrySet()) {
data.putValue(entry.getKey(), entry.getValue());
}
}
@@ -211,7 +211,11 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
* @return The value of the element or null if the key is not present.
*/
public String get(final String key) {
- return data.getValue(key);
+ Object result = data.getValue(key);
+ if (result == null) {
+ return null;
+ }
+ return String.valueOf(result);
}
/**
@@ -220,7 +224,7 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
* @return The previous value of the element.
*/
public String remove(final String key) {
- final String result = data.getValue(key);
+ final String result = get(key);
data.remove(key);
return result;
}
@@ -338,7 +342,10 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
public void asXml(final StringBuilder sb) {
sb.append("<Map>\n");
for (int i = 0; i < data.size(); i++) {
- sb.append(" <Entry key=\"").append(data.getKeyAt(i)).append("\">").append((String)data.getValueAt(i))
+ sb.append(" <Entry key=\"")
+ .append(data.getKeyAt(i))
+ .append("\">")
+ .append(data.<Object>getValueAt(i))
.append("</Entry>\n");
}
sb.append("</Map>");
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/f0123b1d/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 1e06914..9aae448 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -18,6 +18,9 @@ package org.apache.logging.log4j.message;
import org.junit.Test;
+import java.util.HashMap;
+import java.util.Map;
+
import static org.junit.Assert.*;
/**
@@ -99,4 +102,38 @@ public class MapMessageTest {
final String expected2 = "{key1=\"value1\", key2=\"value2\", key3=\"value3\"}";
assertEquals(expected2, result2);
}
+
+ @Test
+ public void testGetNonStringValue() {
+ final String key = "Key";
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with(key, 1L);
+ assertEquals("1", msg.get(key));
+ }
+
+ @Test
+ public void testRemoveNonStringValue() {
+ final String key = "Key";
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with(key, 1L);
+ assertEquals("1", msg.remove(key));
+ }
+
+ @Test
+ public void testJSONFormatNonStringValue() {
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with("key", 1L);
+ final String result = msg.getFormattedMessage(new String[]{"JSON"});
+ final String expected = "{\"key\":\"1\"}";
+ assertEquals(expected, result);
+ }
+
+ @Test
+ public void testXMLFormatNonStringValue() {
+ final MapMessage<?, Object> msg = new MapMessage<>()
+ .with("key", 1L);
+ final String result = msg.getFormattedMessage(new String[]{"XML"});
+ final String expected = "<Map>\n <Entry key=\"key\">1</Entry>\n</Map>";
+ assertEquals(expected, result);
+ }
}
[09/12] logging-log4j2 git commit: Closes #126
Posted by mi...@apache.org.
Closes #126
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/876d6642
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/876d6642
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/876d6642
Branch: refs/heads/master
Commit: 876d6642a5688c28dbb94af946d4a5f38f5e41fd
Parents: 059cdb3
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:09:07 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:09:07 2017 +0100
----------------------------------------------------------------------
----------------------------------------------------------------------
[08/12] logging-log4j2 git commit: Closes #125
Posted by mi...@apache.org.
Closes #125
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/059cdb37
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/059cdb37
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/059cdb37
Branch: refs/heads/master
Commit: 059cdb3725813912a2ab7a0c11a90a03021c047e
Parents: f979609
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:09:05 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:09:05 2017 +0100
----------------------------------------------------------------------
----------------------------------------------------------------------
[12/12] logging-log4j2 git commit: Fix MapMessageTest
Posted by mi...@apache.org.
Fix MapMessageTest
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/a23a4859
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/a23a4859
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/a23a4859
Branch: refs/heads/master
Commit: a23a48590e610cdf1dc2a4ef49e7a324809beed8
Parents: 2b93414
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:31:37 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:31:37 2017 +0100
----------------------------------------------------------------------
.../logging/log4j/message/MapMessageTest.java | 23 +++++++++-----------
.../logging/log4j/message/ObjectMapMessage.java | 22 +++++++++++++++++++
2 files changed, 32 insertions(+), 13 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a23a4859/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 61fda91..a64e6bd 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -19,9 +19,6 @@ package org.apache.logging.log4j.message;
import org.apache.logging.log4j.util.StringBuilderFormattable;
import org.junit.Test;
-import java.util.HashMap;
-import java.util.Map;
-
import static org.junit.Assert.*;
/**
@@ -128,7 +125,7 @@ public class MapMessageTest {
@Test
public void testGetNonStringValue() {
final String key = "Key";
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with(key, 1L);
assertEquals("1", msg.get(key));
}
@@ -136,14 +133,14 @@ public class MapMessageTest {
@Test
public void testRemoveNonStringValue() {
final String key = "Key";
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with(key, 1L);
assertEquals("1", msg.remove(key));
}
@Test
public void testJSONFormatNonStringValue() {
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with("key", 1L);
final String result = msg.getFormattedMessage(new String[]{"JSON"});
final String expected = "{\"key\":\"1\"}";
@@ -152,7 +149,7 @@ public class MapMessageTest {
@Test
public void testXMLFormatNonStringValue() {
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with("key", 1L);
final String result = msg.getFormattedMessage(new String[]{"XML"});
final String expected = "<Map>\n <Entry key=\"key\">1</Entry>\n</Map>";
@@ -161,7 +158,7 @@ public class MapMessageTest {
@Test
public void testFormatToUsedInOutputXml() {
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with("key", new FormattableTestType());
final String result = msg.getFormattedMessage(new String[]{"XML"});
final String expected = "<Map>\n <Entry key=\"key\">formatTo</Entry>\n</Map>";
@@ -170,7 +167,7 @@ public class MapMessageTest {
@Test
public void testFormatToUsedInOutputJson() {
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with("key", new FormattableTestType());
final String result = msg.getFormattedMessage(new String[]{"JSON"});
final String expected = "{\"key\":\"formatTo\"}";
@@ -179,7 +176,7 @@ public class MapMessageTest {
@Test
public void testFormatToUsedInOutputJava() {
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with("key", new FormattableTestType());
final String result = msg.getFormattedMessage(new String[]{"JAVA"});
final String expected = "{key=\"formatTo\"}";
@@ -188,7 +185,7 @@ public class MapMessageTest {
@Test
public void testFormatToUsedInOutputDefault() {
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with("key", new FormattableTestType());
final String result = msg.getFormattedMessage(null);
final String expected = "key=\"formatTo\"";
@@ -198,7 +195,7 @@ public class MapMessageTest {
@Test
public void testGetUsesDeepToString() {
final String key = "key";
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with(key, new FormattableTestType());
final String result = msg.get(key);
final String expected = "formatTo";
@@ -208,7 +205,7 @@ public class MapMessageTest {
@Test
public void testRemoveUsesDeepToString() {
final String key = "key";
- final MapMessage<?, Object> msg = new MapMessage<>()
+ final ObjectMapMessage msg = new ObjectMapMessage()
.with(key, new FormattableTestType());
final String result = msg.remove(key);
final String expected = "formatTo";
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/a23a4859/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMapMessage.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMapMessage.java
new file mode 100644
index 0000000..83716f7
--- /dev/null
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/ObjectMapMessage.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache license, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the license for the specific language governing permissions and
+ * limitations under the license.
+ */
+
+package org.apache.logging.log4j.message;
+
+class ObjectMapMessage extends MapMessage<ObjectMapMessage, Object> {
+
+}
[07/12] logging-log4j2 git commit: Closes #124
Posted by mi...@apache.org.
Closes #124
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/f9796095
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/f9796095
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/f9796095
Branch: refs/heads/master
Commit: f979609546bbf1b5e259d7dfe69d3e73cdc66c4b
Parents: c6373fb
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:09:02 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:09:02 2017 +0100
----------------------------------------------------------------------
----------------------------------------------------------------------
[03/12] logging-log4j2 git commit: StructuredDataMessage implements
MultiFormatStringBuilderFormattable
Posted by mi...@apache.org.
StructuredDataMessage implements MultiFormatStringBuilderFormattable
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/16c0b7ec
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/16c0b7ec
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/16c0b7ec
Branch: refs/heads/master
Commit: 16c0b7ecfd3d5702bfe38fc75951adc200b62158
Parents: 93a7235
Author: Carter Kozak <c4...@gmail.com>
Authored: Wed Nov 8 17:08:22 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100
----------------------------------------------------------------------
.../log4j/message/StructuredDataMessage.java | 21 +++++--
.../pattern/MessagePatternConverterTest.java | 58 ++++++++++++++++++++
2 files changed, 73 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/16c0b7ec/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
index 74a4542..acb95a0 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StructuredDataMessage.java
@@ -20,7 +20,7 @@ package org.apache.logging.log4j.message;
import java.util.Map;
import org.apache.logging.log4j.util.EnglishEnums;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
+import org.apache.logging.log4j.util.MultiFormatStringBuilderFormattable;
import org.apache.logging.log4j.util.StringBuilders;
/**
@@ -35,7 +35,7 @@ import org.apache.logging.log4j.util.StringBuilders;
* @see <a href="https://tools.ietf.org/html/rfc5424">RFC 5424</a>
*/
@AsynchronouslyFormattable
-public class StructuredDataMessage extends MapMessage<StructuredDataMessage, String> implements StringBuilderFormattable {
+public class StructuredDataMessage extends MapMessage<StructuredDataMessage, String> implements MultiFormatStringBuilderFormattable {
private static final long serialVersionUID = 1703221292892071920L;
private static final int MAX_LENGTH = 32;
@@ -253,6 +253,11 @@ public class StructuredDataMessage extends MapMessage<StructuredDataMessage, Str
asString(Format.FULL, null, buffer);
}
+ @Override
+ public void formatTo(String[] formats, StringBuilder buffer) {
+ asString(getFormat(formats), null, buffer);
+ }
+
/**
* Returns the message.
* @return the message.
@@ -367,18 +372,22 @@ public class StructuredDataMessage extends MapMessage<StructuredDataMessage, Str
*/
@Override
public String getFormattedMessage(final String[] formats) {
+ return asString(getFormat(formats), null);
+ }
+
+ private Format getFormat(String[] formats) {
if (formats != null && formats.length > 0) {
for (int i = 0; i < formats.length; i++) {
final String format = formats[i];
if (Format.XML.name().equalsIgnoreCase(format)) {
- return asXml();
+ return Format.XML;
} else if (Format.FULL.name().equalsIgnoreCase(format)) {
- return asString(Format.FULL, null);
+ return Format.FULL;
}
}
- return asString(null, null);
+ return null;
}
- return asString(Format.FULL, null);
+ return Format.FULL;
}
private String asXml() {
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/16c0b7ec/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java
index 2d5a5be..8a1fb0c 100644
--- a/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java
+++ b/log4j-core/src/test/java/org/apache/logging/log4j/core/pattern/MessagePatternConverterTest.java
@@ -26,6 +26,8 @@ import org.apache.logging.log4j.core.impl.Log4jLogEvent;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.ParameterizedMessage;
import org.apache.logging.log4j.message.SimpleMessage;
+import org.apache.logging.log4j.message.StringMapMessage;
+import org.apache.logging.log4j.message.StructuredDataMessage;
import org.junit.Test;
/**
@@ -102,4 +104,60 @@ public class MessagePatternConverterTest {
converter.format(event, sb);
assertEquals("Incorrect length: " + sb, 4, sb.length());
}
+
+ @Test
+ public void testMapMessageFormatJson() throws Exception {
+ final MessagePatternConverter converter = MessagePatternConverter.newInstance(null, new String[]{"json"});
+ Message msg = new StringMapMessage()
+ .with("key", "val");
+ LogEvent event = Log4jLogEvent.newBuilder() //
+ .setLoggerName("MyLogger") //
+ .setLevel(Level.DEBUG) //
+ .setMessage(msg).build();
+ StringBuilder sb = new StringBuilder();
+ converter.format(event, sb);
+ assertEquals("Unexpected result", "{\"key\":\"val\"}", sb.toString());
+ }
+
+ @Test
+ public void testMapMessageFormatXml() throws Exception {
+ final MessagePatternConverter converter = MessagePatternConverter.newInstance(null, new String[]{"xml"});
+ Message msg = new StringMapMessage()
+ .with("key", "val");
+ LogEvent event = Log4jLogEvent.newBuilder() //
+ .setLoggerName("MyLogger") //
+ .setLevel(Level.DEBUG) //
+ .setMessage(msg).build();
+ StringBuilder sb = new StringBuilder();
+ converter.format(event, sb);
+ assertEquals("Unexpected result", "<Map>\n <Entry key=\"key\">val</Entry>\n</Map>", sb.toString());
+ }
+
+ @Test
+ public void testMapMessageFormatDefault() throws Exception {
+ final MessagePatternConverter converter = MessagePatternConverter.newInstance(null, null);
+ Message msg = new StringMapMessage()
+ .with("key", "val");
+ LogEvent event = Log4jLogEvent.newBuilder() //
+ .setLoggerName("MyLogger") //
+ .setLevel(Level.DEBUG) //
+ .setMessage(msg).build();
+ StringBuilder sb = new StringBuilder();
+ converter.format(event, sb);
+ assertEquals("Unexpected result", "key=\"val\"", sb.toString());
+ }
+
+ @Test
+ public void testStructuredDataFormatFull() throws Exception {
+ final MessagePatternConverter converter = MessagePatternConverter.newInstance(null, new String[]{"FULL"});
+ Message msg = new StructuredDataMessage("id", "message", "type")
+ .with("key", "val");
+ LogEvent event = Log4jLogEvent.newBuilder() //
+ .setLoggerName("MyLogger") //
+ .setLevel(Level.DEBUG) //
+ .setMessage(msg).build();
+ StringBuilder sb = new StringBuilder();
+ converter.format(event, sb);
+ assertEquals("Unexpected result", "type [id key=\"val\"] message", sb.toString());
+ }
}
[04/12] logging-log4j2 git commit: LOG4J2-2107: MapMessage
allocation-free pattern conversion
Posted by mi...@apache.org.
LOG4J2-2107: MapMessage allocation-free pattern conversion
Fixes an issue causing MessagePatternConverter to greedily format
MapMessage instances as StringBuilderFormattable ignoring format.
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/93a7235d
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/93a7235d
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/93a7235d
Branch: refs/heads/master
Commit: 93a7235da78c562026993cdc4e3e5775c47e8099
Parents: 6757d39
Author: Carter Kozak <c4...@gmail.com>
Authored: Wed Nov 8 16:53:31 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100
----------------------------------------------------------------------
.../logging/log4j/message/MapMessage.java | 22 +++++++++++------
.../MultiFormatStringBuilderFormattable.java | 25 ++++++++++++++++++++
.../core/pattern/MessagePatternConverter.java | 8 +++++--
3 files changed, 46 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/93a7235d/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index 48f7ec7..57894b8 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -25,10 +25,10 @@ import org.apache.logging.log4j.util.Chars;
import org.apache.logging.log4j.util.EnglishEnums;
import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
import org.apache.logging.log4j.util.IndexedStringMap;
+import org.apache.logging.log4j.util.MultiFormatStringBuilderFormattable;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.ReadOnlyStringMap;
import org.apache.logging.log4j.util.SortedArrayStringMap;
-import org.apache.logging.log4j.util.StringBuilderFormattable;
import org.apache.logging.log4j.util.StringBuilders;
import org.apache.logging.log4j.util.Strings;
import org.apache.logging.log4j.util.TriConsumer;
@@ -49,9 +49,9 @@ import org.apache.logging.log4j.util.TriConsumer;
*/
@PerformanceSensitive("allocation")
@AsynchronouslyFormattable
-public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMessage, StringBuilderFormattable {
+public class MapMessage<M extends MapMessage<M, V>, V> implements MultiFormatStringBuilderFormattable {
- private static final long serialVersionUID = -5031471831131487120L;
+ private static final long serialVersionUID = -5031471831131487120L;
/**
* When set as the format specifier causes the Map to be formatted as XML.
@@ -375,17 +375,20 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
*/
@Override
public String getFormattedMessage(final String[] formats) {
+ return format(getFormat(formats), new StringBuilder()).toString();
+ }
+
+ private MapFormat getFormat(final String[] formats) {
if (formats == null || formats.length == 0) {
- return asString();
+ return null;
}
for (int i = 0; i < formats.length; i++) {
final MapFormat mapFormat = MapFormat.lookupIgnoreCase(formats[i]);
if (mapFormat != null) {
- return format(mapFormat, new StringBuilder()).toString();
+ return mapFormat;
}
}
- return asString();
-
+ return null;
}
protected void appendMap(final StringBuilder sb) {
@@ -449,6 +452,11 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
}
@Override
+ public void formatTo(String[] formats, StringBuilder buffer) {
+ format(getFormat(formats), buffer);
+ }
+
+ @Override
public boolean equals(final Object o) {
if (this == o) {
return true;
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/93a7235d/log4j-api/src/main/java/org/apache/logging/log4j/util/MultiFormatStringBuilderFormattable.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/MultiFormatStringBuilderFormattable.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/MultiFormatStringBuilderFormattable.java
new file mode 100644
index 0000000..4b7cb3e
--- /dev/null
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/MultiFormatStringBuilderFormattable.java
@@ -0,0 +1,25 @@
+package org.apache.logging.log4j.util;
+
+import org.apache.logging.log4j.message.MultiformatMessage;
+
+/**
+ * A Message that can render itself in more than one way. The format string is used by the
+ * Message implementation as extra information that it may use to help it to determine how
+ * to format itself. For example, MapMessage accepts a format of "XML" to tell it to render
+ * the Map as XML instead of its default format of {key1="value1" key2="value2"}.
+ *
+ * @since 2.10
+ */
+public interface MultiFormatStringBuilderFormattable extends MultiformatMessage, StringBuilderFormattable {
+
+ /**
+ * Writes a text representation of this object into the specified {@code StringBuilder}, ideally without allocating
+ * temporary objects.
+ *
+ * @param formats An array of Strings that provide extra information about how to format the message.
+ * Each MultiFormatStringBuilderFormattable implementation is free to use the provided formats however they choose.
+ * @param buffer the StringBuilder to write into
+ */
+ void formatTo(String[] formats, StringBuilder buffer);
+
+}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/93a7235d/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
index 1cecfd5..7b1d77e 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MessagePatternConverter.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.core.util.Loader;
import org.apache.logging.log4j.message.Message;
import org.apache.logging.log4j.message.MultiformatMessage;
import org.apache.logging.log4j.status.StatusLogger;
+import org.apache.logging.log4j.util.MultiFormatStringBuilderFormattable;
import org.apache.logging.log4j.util.PerformanceSensitive;
import org.apache.logging.log4j.util.StringBuilderFormattable;
@@ -114,9 +115,12 @@ public final class MessagePatternConverter extends LogEventPatternConverter {
final boolean doRender = textRenderer != null;
final StringBuilder workingBuilder = doRender ? new StringBuilder(80) : toAppendTo;
- final StringBuilderFormattable stringBuilderFormattable = (StringBuilderFormattable) msg;
final int offset = workingBuilder.length();
- stringBuilderFormattable.formatTo(workingBuilder);
+ if (msg instanceof MultiFormatStringBuilderFormattable) {
+ ((MultiFormatStringBuilderFormattable) msg).formatTo(formats, workingBuilder);
+ } else {
+ ((StringBuilderFormattable) msg).formatTo(workingBuilder);
+ }
// TODO can we optimize this?
if (config != null && !noLookups) {
[05/12] logging-log4j2 git commit: LOG4J2-2102: MapMessage Json and
XML encodings escape keys and values
Posted by mi...@apache.org.
LOG4J2-2102: MapMessage Json and XML encodings escape keys and values
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/6757d397
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/6757d397
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/6757d397
Branch: refs/heads/master
Commit: 6757d39783f62961fe9f520367799f8d6fb30bca
Parents: f0123b1
Author: Carter Kozak <c4...@gmail.com>
Authored: Mon Nov 6 13:49:36 2017 -0500
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:09 2017 +0100
----------------------------------------------------------------------
.../logging/log4j/message/MapMessage.java | 20 ++++++---
.../logging/log4j/util/StringBuilders.java | 44 ++++++++++++++++++++
.../logging/log4j/message/MapMessageTest.java | 21 ++++++++++
.../core/pattern/EncodingPatternConverter.java | 41 ++----------------
4 files changed, 83 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6757d397/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
index 649772d..48f7ec7 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MapMessage.java
@@ -21,6 +21,7 @@ import java.util.Map;
import java.util.TreeMap;
import org.apache.logging.log4j.util.BiConsumer;
+import org.apache.logging.log4j.util.Chars;
import org.apache.logging.log4j.util.EnglishEnums;
import org.apache.logging.log4j.util.IndexedReadOnlyStringMap;
import org.apache.logging.log4j.util.IndexedStringMap;
@@ -344,9 +345,11 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
for (int i = 0; i < data.size(); i++) {
sb.append(" <Entry key=\"")
.append(data.getKeyAt(i))
- .append("\">")
- .append(data.<Object>getValueAt(i))
- .append("</Entry>\n");
+ .append("\">");
+ int size = sb.length();
+ sb.append(data.<Object>getValueAt(i));
+ StringBuilders.escapeXml(sb, size);
+ sb.append("</Entry>\n");
}
sb.append("</Map>");
}
@@ -400,8 +403,15 @@ public class MapMessage<M extends MapMessage<M, V>, V> implements MultiformatMes
if (i > 0) {
sb.append(", ");
}
- StringBuilders.appendDqValue(sb, data.getKeyAt(i)).append(':');
- StringBuilders.appendDqValue(sb, data.getValueAt(i));
+ sb.append(Chars.DQUOTE);
+ int start = sb.length();
+ sb.append(data.getKeyAt(i));
+ StringBuilders.escapeJson(sb, start);
+ sb.append(Chars.DQUOTE).append(':').append(Chars.DQUOTE);
+ start = sb.length();
+ sb.append(data.<Object>getValueAt(i));
+ StringBuilders.escapeJson(sb, start);
+ sb.append(Chars.DQUOTE);
}
sb.append('}');
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6757d397/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
index 2d6ae9c..1ab0909 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java
@@ -158,4 +158,48 @@ public final class StringBuilders {
stringBuilder.trimToSize();
}
}
+
+ public static void escapeJson(final StringBuilder toAppendTo, final int start) {
+ for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
+ final char c = toAppendTo.charAt(i);
+ if (Character.isISOControl(c)) {
+ // all iso control characters are in U+00xx
+ toAppendTo.setCharAt(i, '\\');
+ toAppendTo.insert(i + 1, "u0000");
+ toAppendTo.setCharAt(i + 4, Chars.getUpperCaseHex((c & 0xF0) >> 4));
+ toAppendTo.setCharAt(i + 5, Chars.getUpperCaseHex(c & 0xF));
+ } else if (c == '"' || c == '\\') {
+ // only " and \ need to be escaped; other escapes are optional
+ toAppendTo.insert(i, '\\');
+ }
+ }
+ }
+
+ public static void escapeXml(final StringBuilder toAppendTo, final int start) {
+ for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
+ final char c = toAppendTo.charAt(i);
+ switch (c) {
+ case '&':
+ toAppendTo.setCharAt(i, '&');
+ toAppendTo.insert(i + 1, "amp;");
+ break;
+ case '<':
+ toAppendTo.setCharAt(i, '&');
+ toAppendTo.insert(i + 1, "lt;");
+ break;
+ case '>':
+ toAppendTo.setCharAt(i, '&');
+ toAppendTo.insert(i + 1, "gt;");
+ break;
+ case '"':
+ toAppendTo.setCharAt(i, '&');
+ toAppendTo.insert(i + 1, "quot;");
+ break;
+ case '\'':
+ toAppendTo.setCharAt(i, '&');
+ toAppendTo.insert(i + 1, "apos;");
+ break;
+ }
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6757d397/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
index 9aae448..781d46d 100644
--- a/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
+++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/MapMessageTest.java
@@ -64,6 +64,17 @@ public class MapMessageTest {
}
@Test
+ public void testXMLEscape() {
+ final String testMsg = "Test message <foo>";
+ final StringMapMessage msg = new StringMapMessage();
+ msg.put("message", testMsg);
+ final String result = msg.getFormattedMessage(new String[]{"XML"});
+ final String expected = "<Map>\n <Entry key=\"message\">Test message <foo></Entry>\n" +
+ "</Map>";
+ assertEquals(expected, result);
+ }
+
+ @Test
public void testJSON() {
final String testMsg = "Test message {}";
final StringMapMessage msg = new StringMapMessage();
@@ -75,6 +86,16 @@ public class MapMessageTest {
}
@Test
+ public void testJSONEscape() {
+ final String testMsg = "Test message \"Hello, World!\"";
+ final StringMapMessage msg = new StringMapMessage();
+ msg.put("message", testMsg);
+ final String result = msg.getFormattedMessage(new String[]{"JSON"});
+ final String expected = "{\"message\":\"Test message \\\"Hello, World!\\\"\"}";
+ assertEquals(expected, result);
+ }
+
+ @Test
public void testJava() {
final String testMsg = "Test message {}";
final StringMapMessage msg = new StringMapMessage();
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/6757d397/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
----------------------------------------------------------------------
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
index 4d22ee0..2699b1f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/EncodingPatternConverter.java
@@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.layout.PatternLayout;
import org.apache.logging.log4j.util.Chars;
import org.apache.logging.log4j.util.EnglishEnums;
import org.apache.logging.log4j.util.PerformanceSensitive;
+import org.apache.logging.log4j.util.StringBuilders;
/**
* Converter that encodes the output from a pattern using a specified format. Supported formats include HTML
@@ -139,19 +140,7 @@ public final class EncodingPatternConverter extends LogEventPatternConverter {
JSON {
@Override
void escape(final StringBuilder toAppendTo, final int start) {
- for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
- final char c = toAppendTo.charAt(i);
- if (Character.isISOControl(c)) {
- // all iso control characters are in U+00xx
- toAppendTo.setCharAt(i, '\\');
- toAppendTo.insert(i + 1, "u0000");
- toAppendTo.setCharAt(i + 4, Chars.getUpperCaseHex((c & 0xF0) >> 4));
- toAppendTo.setCharAt(i + 5, Chars.getUpperCaseHex(c & 0xF));
- } else if (c == '"' || c == '\\') {
- // only " and \ need to be escaped; other escapes are optional
- toAppendTo.insert(i, '\\');
- }
- }
+ StringBuilders.escapeJson(toAppendTo, start);
}
},
@@ -182,31 +171,7 @@ public final class EncodingPatternConverter extends LogEventPatternConverter {
XML {
@Override
void escape(final StringBuilder toAppendTo, final int start) {
- for (int i = toAppendTo.length() - 1; i >= start; i--) { // backwards: length may change
- final char c = toAppendTo.charAt(i);
- switch (c) {
- case '&':
- toAppendTo.setCharAt(i, '&');
- toAppendTo.insert(i + 1, "amp;");
- break;
- case '<':
- toAppendTo.setCharAt(i, '&');
- toAppendTo.insert(i + 1, "lt;");
- break;
- case '>':
- toAppendTo.setCharAt(i, '&');
- toAppendTo.insert(i + 1, "gt;");
- break;
- case '"':
- toAppendTo.setCharAt(i, '&');
- toAppendTo.insert(i + 1, "quot;");
- break;
- case '\'':
- toAppendTo.setCharAt(i, '&');
- toAppendTo.insert(i + 1, "apos;");
- break;
- }
- }
+ StringBuilders.escapeXml(toAppendTo, start);
}
};
[11/12] logging-log4j2 git commit: Merge remote-tracking branch
'origin/master'
Posted by mi...@apache.org.
Merge remote-tracking branch 'origin/master'
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/2b93414a
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/2b93414a
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/2b93414a
Branch: refs/heads/master
Commit: 2b93414a403c21003774f7b0a8f92f143b5fec3c
Parents: cadb81f c61f37d
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:17:35 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:17:35 2017 +0100
----------------------------------------------------------------------
.../org/apache/logging/log4j/appserver/jetty/Log4j2Logger.java | 2 ++
.../org/apache/logging/log4j/appserver/tomcat/TomcatLogger.java | 2 ++
2 files changed, 4 insertions(+)
----------------------------------------------------------------------
[10/12] logging-log4j2 git commit: Update changes.xml
Posted by mi...@apache.org.
Update changes.xml
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/cadb81fc
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/cadb81fc
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/cadb81fc
Branch: refs/heads/master
Commit: cadb81fc56f31f1fc4aa081e1dfa33d3ce61bd72
Parents: 876d664
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:17:29 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:17:29 2017 +0100
----------------------------------------------------------------------
src/changes/changes.xml | 12 ++++++++++++
1 file changed, 12 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/cadb81fc/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 184432b..17ca19d 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -31,6 +31,18 @@
- "remove" - Removed
-->
<release version="2.10.0" date="2017-MM-DD" description="GA Release 2.10.0">
+ <action issue="LOG4J2-2112" dev="mikes" type="add" due-to="Carter Douglas Kozak ">
+ MapMessage should use deep toString for values.
+ </action>
+ <action issue="LOG4J2-2107" dev="mikes" type="fix" due-to="Carter Douglas Kozak ">
+ MapMessage supports both StringBuilderFormattable and MultiformatMessage.
+ </action>
+ <action issue="LOG4J2-2102" dev="mikes" type="fix" due-to="Carter Douglas Kozak ">
+ MapMessage JSON encoding will escape keys and values.
+ </action>
+ <action issue="LOG4J2-2101" dev="mikes" type="fix" due-to="Carter Douglas Kozak ">
+ Non-string value in MapMessage caused ClassCastException.
+ </action>
<action issue="LOG4J2-2106" dev="rogers" type="fix">
Reduce locking when checking for rollover.
</action>
[06/12] logging-log4j2 git commit: Closes #129
Posted by mi...@apache.org.
Closes #129
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/c6373fbb
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/c6373fbb
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/c6373fbb
Branch: refs/heads/master
Commit: c6373fbbed6842254c8aa7bc5d46dea6ea574d35
Parents: 99287e8
Author: Mikael Ståldal <mi...@staldal.nu>
Authored: Sat Nov 11 22:08:32 2017 +0100
Committer: Mikael Ståldal <mi...@staldal.nu>
Committed: Sat Nov 11 22:08:32 2017 +0100
----------------------------------------------------------------------
----------------------------------------------------------------------