You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@logging.apache.org by "Markus Spann (Jira)" <ji...@apache.org> on 2021/06/28 10:10:00 UTC

[jira] [Created] (LOG4J2-3113) Support Supplier<> in varargs log message parameters

Markus Spann created LOG4J2-3113:
------------------------------------

             Summary: 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


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)