Repository: logging-log4j2 Updated Branches: refs/heads/master dc80330b5 -> b95cc70e4
Message implementors must implement toString() to return a value that will work as 'normal' Strings in order to play well with the Supplier APIs like traceEnter(Supplier). Also introduce an AbstractMessage class that JsonMessage extends. For now, the stock Message implementors do not extend AbstractMessage because that would make reading in 2.5 serialized Messages break. We can decide later if we want to make Message implementors extend AbstractMessage. Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/b95cc70e Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/b95cc70e Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/b95cc70e Branch: refs/heads/master Commit: b95cc70e41e0033a406a0a2ccda4d4bc76341ca2 Parents: dc80330 Author: ggregory <[email protected]> Authored: Fri Feb 12 13:48:18 2016 -0800 Committer: ggregory <[email protected]> Committed: Fri Feb 12 13:48:18 2016 -0800 ---------------------------------------------------------------------- .../logging/log4j/message/AbstractMessage.java | 37 ++++ .../logging/log4j/message/FormattedMessage.java | 3 +- .../logging/log4j/message/LocalizedMessage.java | 5 + .../log4j/message/MessageFormatMessage.java | 3 +- .../log4j/message/ObjectArrayMessage.java | 2 +- .../log4j/message/ParameterizedMessage.java | 3 +- .../logging/log4j/message/SimpleMessage.java | 2 +- .../log4j/message/StringFormattedMessage.java | 3 +- .../log4j/message/ThreadDumpMessage.java | 7 +- .../logging/log4j/LoggerSupplierTest.java | 196 +++++++++++++++++++ .../logging/log4j/message/JsonMessage.java | 7 +- 11 files changed, 246 insertions(+), 22 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessage.java new file mode 100644 index 0000000..3981515 --- /dev/null +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/AbstractMessage.java @@ -0,0 +1,37 @@ +/* + * 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; + +/** + * Common services for Message implementors. + * + * @since 2.6 + */ +public abstract class AbstractMessage implements Message { + + private static final long serialVersionUID = 1L; + + /** + * Converts this message to it's formatted message String. + * + * @return this message as formatted message String. + */ + @Override + public String toString() { + return getFormattedMessage(); + } +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java index 39019d0..2e4b5c0 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/FormattedMessage.java @@ -159,8 +159,7 @@ public class FormattedMessage implements Message { @Override public String toString() { - return "FormattedMessage[messagePattern=" + messagePattern + ", args=" + - Arrays.toString(argArray) + ']'; + return getFormattedMessage(); } private void writeObject(final ObjectOutputStream out) throws IOException { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java index c071a20..93d8d3a 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/LocalizedMessage.java @@ -255,6 +255,11 @@ public class LocalizedMessage implements Message, LoggerNameAwareMessage { return rb; } + @Override + public String toString() { + return getFormattedMessage(); + } + private void writeObject(final ObjectOutputStream out) throws IOException { out.defaultWriteObject(); getFormattedMessage(); http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java index 705aed9..9660707 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/MessageFormatMessage.java @@ -125,8 +125,7 @@ public class MessageFormatMessage implements Message { @Override public String toString() { - return "StringFormatMessage[messagePattern=" + messagePattern + ", args=" + - Arrays.toString(parameters) + ']'; + return getFormattedMessage(); } private void writeObject(final ObjectOutputStream out) throws IOException { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java index 729d9c5..71eb736 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectArrayMessage.java @@ -124,7 +124,7 @@ public final class ObjectArrayMessage implements Message { @Override public String toString() { - return "ObjectArrayMessage[obj=" + getFormattedMessage() + ']'; + return getFormattedMessage(); } private void writeObject(final ObjectOutputStream out) throws IOException { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java index 8d61abb..334e19b 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ParameterizedMessage.java @@ -750,7 +750,6 @@ public class ParameterizedMessage implements Message { @Override public String toString() { - return "ParameterizedMessage[messagePattern=" + messagePattern + ", stringArgs=" + - Arrays.toString(stringArgs) + ", throwable=" + throwable + ']'; + return getFormattedMessage(); } } http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java index 31479bb..de3b769 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/SimpleMessage.java @@ -87,7 +87,7 @@ public class SimpleMessage implements Message { @Override public String toString() { - return "SimpleMessage[message=" + message + ']'; + return getFormattedMessage(); } /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java index 838023c..9881c96 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/StringFormattedMessage.java @@ -120,8 +120,7 @@ public class StringFormattedMessage implements Message { @Override public String toString() { - return "StringFormatMessage[messagePattern=" + messagePattern + ", args=" + - Arrays.toString(argArray) + ']'; + return getFormattedMessage(); } private void writeObject(final ObjectOutputStream out) throws IOException { http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java index 77c15df..9e8fd7c 100644 --- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java +++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java @@ -72,12 +72,7 @@ public class ThreadDumpMessage implements Message { @Override public String toString() { - final StringBuilder sb = new StringBuilder("ThreadDumpMessage["); - if (this.title.length() > 0) { - StringBuilders.appendKeyDqValue(sb, "Title", this.title); - } - sb.append(']'); - return sb.toString(); + return getFormattedMessage(); } /** http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/test/java/org/apache/logging/log4j/LoggerSupplierTest.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/LoggerSupplierTest.java b/log4j-api/src/test/java/org/apache/logging/log4j/LoggerSupplierTest.java new file mode 100644 index 0000000..a8e8739 --- /dev/null +++ b/log4j-api/src/test/java/org/apache/logging/log4j/LoggerSupplierTest.java @@ -0,0 +1,196 @@ +/* + * 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; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.startsWith; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.util.List; + +import org.apache.logging.log4j.message.FormattedMessage; +import org.apache.logging.log4j.message.JsonMessage; +import org.apache.logging.log4j.message.LocalizedMessage; +import org.apache.logging.log4j.message.MessageFormatMessage; +import org.apache.logging.log4j.message.ObjectArrayMessage; +import org.apache.logging.log4j.message.ObjectMessage; +import org.apache.logging.log4j.message.ParameterizedMessage; +import org.apache.logging.log4j.message.SimpleMessage; +import org.apache.logging.log4j.message.StringFormattedMessage; +import org.apache.logging.log4j.message.ThreadDumpMessage; +import org.apache.logging.log4j.util.Supplier; +import org.junit.Before; +import org.junit.Test; + +/** + * Tests Logger APIs with MessageSupplier and Supplier. + */ +public class LoggerSupplierTest { + + private final TestLogger logger = (TestLogger) LogManager.getLogger("LoggerTest"); + + private final List<String> results = logger.getEntries(); + + @Test + public void flowTracing_SupplierOfFormattedMessage() { + logger.traceEntry(new Supplier<FormattedMessage>() { + @Override + public FormattedMessage get() { + return new FormattedMessage("int foo={}", 1234567890); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("(int foo=1234567890)")); + assertThat("Bad toString()", results.get(0), not(containsString("FormattedMessage"))); + } + + @Test + public void flowTracing_SupplierOfJsonMessage() { + logger.traceEntry(new Supplier<JsonMessage>() { + @Override + public JsonMessage get() { + return new JsonMessage(System.getProperties()); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("\"java.runtime.name\":")); + assertThat("Bad toString()", results.get(0), not(containsString("JsonMessage"))); + } + + @Test + public void flowTracing_SupplierOfLocalizedMessage() { + logger.traceEntry(new Supplier<LocalizedMessage>() { + @Override + public LocalizedMessage get() { + return new LocalizedMessage("int foo={}", 1234567890); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("(int foo=1234567890)")); + assertThat("Bad toString()", results.get(0), not(containsString("LocalizedMessage"))); + } + + @Test + public void flowTracing_SupplierOfMessageFormatMessage() { + logger.traceEntry(new Supplier<MessageFormatMessage>() { + @Override + public MessageFormatMessage get() { + return new MessageFormatMessage("int foo={0}", 1234567890); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("(int foo=1,234,567,890)")); + assertThat("Bad toString()", results.get(0), not(containsString("MessageFormatMessage"))); + } + + @Test + public void flowTracing_SupplierOfObjectArrayMessage() { + logger.traceEntry(new Supplier<ObjectArrayMessage>() { + @Override + public ObjectArrayMessage get() { + return new ObjectArrayMessage(1234567890); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("([1234567890])")); + assertThat("Bad toString()", results.get(0), not(containsString("ObjectArrayMessage"))); + } + + @Test + public void flowTracing_SupplierOfObjectMessage() { + logger.traceEntry(new Supplier<ObjectMessage>() { + @Override + public ObjectMessage get() { + return new ObjectMessage(1234567890); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("(1234567890)")); + assertThat("Bad toString()", results.get(0), not(containsString("ObjectMessage"))); + } + + @Test + public void flowTracing_SupplierOfParameterizedMessage() { + logger.traceEntry(new Supplier<ParameterizedMessage>() { + @Override + public ParameterizedMessage get() { + return new ParameterizedMessage("int foo={}", 1234567890); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("(int foo=1234567890)")); + assertThat("Bad toString()", results.get(0), not(containsString("ParameterizedMessage"))); + } + + @Test + public void flowTracing_SupplierOfSimpleMessage() { + logger.traceEntry(new Supplier<SimpleMessage>() { + @Override + public SimpleMessage get() { + return new SimpleMessage("1234567890"); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("(1234567890)")); + assertThat("Bad toString()", results.get(0), not(containsString("SimpleMessage"))); + } + + @Test + public void flowTracing_SupplierOfStringFormattedMessage() { + logger.traceEntry(new Supplier<StringFormattedMessage>() { + @Override + public StringFormattedMessage get() { + return new StringFormattedMessage("int foo=%,d", 1234567890); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("(int foo=1,234,567,890)")); + assertThat("Bad toString()", results.get(0), not(containsString("StringFormattedMessage"))); + } + + @Test + public void flowTracing_SupplierOfThreadDumpMessage() { + logger.traceEntry(new Supplier<ThreadDumpMessage>() { + @Override + public ThreadDumpMessage get() { + return new ThreadDumpMessage("Title of ..."); + } + }); + assertEquals(1, results.size()); + assertThat("Incorrect Entry", results.get(0), startsWith("ENTRY[ FLOW ] TRACE entry")); + assertThat("Missing entry data", results.get(0), containsString("RUNNABLE")); + assertThat("Missing entry data", results.get(0), containsString("Title of ...")); + assertThat("Missing entry data", results.get(0), containsString(getClass().getName())); + } + + @Before + public void setup() { + results.clear(); + } + +} http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/b95cc70e/log4j-api/src/test/java/org/apache/logging/log4j/message/JsonMessage.java ---------------------------------------------------------------------- diff --git a/log4j-api/src/test/java/org/apache/logging/log4j/message/JsonMessage.java b/log4j-api/src/test/java/org/apache/logging/log4j/message/JsonMessage.java index 1d27365..b0294b6 100644 --- a/log4j-api/src/test/java/org/apache/logging/log4j/message/JsonMessage.java +++ b/log4j-api/src/test/java/org/apache/logging/log4j/message/JsonMessage.java @@ -24,7 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; /** * Converts an Object to a JSON String. */ -public class JsonMessage implements Message { +public class JsonMessage extends AbstractMessage { private static final long serialVersionUID = 1L; private static final ObjectMapper mapper = new ObjectMapper(); @@ -63,9 +63,4 @@ public class JsonMessage implements Message { public Throwable getThrowable() { return null; } - - @Override - public String toString() { - return getFormattedMessage(); - } }
