The reason is that the Object returned by the Supplier<?> will be wrapped in a new Message ( https://logging.apache.org/log4j/2.x/log4j-api/xref/org/apache/logging/log4j/spi/AbstractLogger.html#L1003), while the Message returned by MessageSupplier is used as is ( https://logging.apache.org/log4j/2.x/log4j-api/xref/org/apache/logging/log4j/spi/AbstractLogger.html#L997 ).
With hindsight, that could have been implemented without introducing MessageSupplier. Darn, darn, darn! Could have been implemented like this: Object obj = supplier.get(); Message msg = obj instanceof Message ? (Message) obj : messageFactory.newMessage(obj); logMessage(... msg ...); Why didn't I see this sooner? Mea culpa. On Saturday, 13 February 2016, Matt Sicker <[email protected]> wrote: > Yeah really, what was the point of MessageSupplier as a separate interface > from Supplier<Message>? They were both added in 2.4. > > On 12 February 2016 at 17:49, Gary Gregory <[email protected] > <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: > >> Hi Remko, >> >> On Fri, Feb 12, 2016 at 3:31 PM, Remko Popma <[email protected] >> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >> >>> I like the original code better since it gives more information. >>> >> >> The trick is to get a message in your log that makes sense, and, in this >> case, a debug-oriented toString() does not make sense (to me at least, >> please see the test cases I committed today and play around). In general >> though, FWIW, I do like toString() methods to be debug-oriented. >> >> >>> Also, if you want to provide for lamdas that supply a Message, provide a >>> method that accepts a MessageSupplier. >>> >> >> We provide both Supplier<?> and MessageSupplier APIs, I am just testing >> it all, starting with Supplier. I'll also add MessageSupplier tests. >> >> What is confusing is why we have both MessageSupplier and Supplier and >> why MessageSupplier is not defined as extending Supplier<Message>. >> >> Gary >> >> >>> >>> The reason is that the Object returned by the Supplier<?> will be >>> wrapped in a new Message ( >>> https://logging.apache.org/log4j/2.x/log4j-api/xref/org/apache/logging/log4j/spi/AbstractLogger.html#L1003), >>> while the Message returned by MessageSupplier is used as is ( >>> https://logging.apache.org/log4j/2.x/log4j-api/xref/org/apache/logging/log4j/spi/AbstractLogger.html#L997 >>> ). >>> >>> On Saturday, 13 February 2016, <[email protected] >>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote: >>> >>>> Repository: logging-log4j2 >>>> Updated Branches: >>>> refs/heads/master 13f49fccc -> dc80330b5 >>>> >>>> >>>> Make ObjectMessage work for code like logger.traceEntry(new >>>> Supplier<ObjectMessage>() { ... Tests to follow but are currently mixed >>>> with other changes in my local repo. >>>> >>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo >>>> Commit: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/dc80330b >>>> Tree: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/dc80330b >>>> Diff: >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/dc80330b >>>> >>>> Branch: refs/heads/master >>>> Commit: dc80330b521535746969e888c4b59539a147c265 >>>> Parents: 13f49fc >>>> Author: ggregory <[email protected]> >>>> Authored: Fri Feb 12 11:13:03 2016 -0800 >>>> Committer: ggregory <[email protected]> >>>> Committed: Fri Feb 12 11:13:03 2016 -0800 >>>> >>>> ---------------------------------------------------------------------- >>>> .../main/java/org/apache/logging/log4j/message/ObjectMessage.java | 2 >>>> +- >>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>> ---------------------------------------------------------------------- >>>> >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/dc80330b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java >>>> ---------------------------------------------------------------------- >>>> diff --git >>>> a/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java >>>> b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java >>>> index 7cffe47..ad3dba8 100644 >>>> --- >>>> a/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java >>>> +++ >>>> b/log4j-api/src/main/java/org/apache/logging/log4j/message/ObjectMessage.java >>>> @@ -98,7 +98,7 @@ public class ObjectMessage implements Message { >>>> >>>> @Override >>>> public String toString() { >>>> - return "ObjectMessage[obj=" + getFormattedMessage() + ']'; >>>> + return getFormattedMessage(); >>>> } >>>> >>>> private void writeObject(final ObjectOutputStream out) throws >>>> IOException { >>>> >>>> >> >> >> -- >> E-Mail: [email protected] >> <javascript:_e(%7B%7D,'cvml','[email protected]');> | >> [email protected] >> <javascript:_e(%7B%7D,'cvml','[email protected]');> >> Java Persistence with Hibernate, Second Edition >> <http://www.manning.com/bauer3/> >> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/> >> Spring Batch in Action <http://www.manning.com/templier/> >> Blog: http://garygregory.wordpress.com >> Home: http://garygregory.com/ >> Tweet! http://twitter.com/GaryGregory >> > > > > -- > Matt Sicker <[email protected] > <javascript:_e(%7B%7D,'cvml','[email protected]');>> >
