[
https://issues.apache.org/jira/browse/LOG4J2-3113?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17378075#comment-17378075
]
Carter Kozak commented on LOG4J2-3113:
--------------------------------------
I agree with [~rgoers] that such a proposal could result in confusion and
non-obvious behavior.
Consider a type: {{class MyResource implements MyService, Closeable,
Supplier<IdentifierFactory> {}}
If such a type is logged to JUL directly, I'd imagine we'd want to record which
instance of MyResource was logged, not the IdentifierFactory that it happens to
produce. I'd argue that implementing supplier in this way isn't ideal, and
function references should be preferred, it's a pattern that exists in the
world.
Similarly, logging a supplier to a var-args or object method isn't very clean
because {{Logger.log(level, "message", () -> "str: " +
getExpensiveStringValue()}} doesn't compile. One must either include a cast,
factory function, or an anonymous class. At that point I'd argue it's easier to
both read and write the statement protected by a logger level check condition
than create a roundabout supplier instance.
> Support Supplier<> in varargs log message parameters
> ----------------------------------------------------
>
> Key: LOG4J2-3113
> URL: https://issues.apache.org/jira/browse/LOG4J2-3113
> Project: Log4j 2
> Issue Type: Improvement
> Components: API
> Affects Versions: 2.14.1
> Reporter: Markus Spann
> Priority: Minor
>
> It would be very useful, to give special treatment to message parameters of
> type {{java.util.function.Supplier<T>}} by calling {{get()}} rather than
> {{toString()}} on it while creating the log message.
> Message parameters (i.e. method calls that return the parameter) that are
> expensive to compute can thus be computed lazily.
> What's more, the logging call reads more naturally just like all other
> logging calls that use wildcards and parameters.
> {code:java}
> java.lang.System.Logger logger = System.getLogger("toto");
> // already supported style using a single Supplier
> logger.log(Level.DEBUG, () -> "Contents of array: " +
> Arrays.deepToString(array));{code}
> {code:java}
> // compiles but calls toString() rather than Supplier.get()
> logger.log(Level.DEBUG, "Contents of array: {}", (Supplier<String>) () ->
> Arrays.deepToString(array));{code}
> I've looked through the log4j2 Jira and found issue LOG4J2-599 in which a
> similar request was previously discussed without actually adding the feature
> to log4j2.
> (Note: Strangely Java requires the cast to (Supplier<String>).)
> My suggestion is to add Supplier support by enhancing method
> {{org.apache.logging.log4j.util.StringBuilders.appendSpecificTypes()}}.
> I will provide a Pull Request if you agree to the enhancement.
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)