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)