[ https://issues.apache.org/jira/browse/LOG4J2-3113?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17374733#comment-17374733 ]
Markus Spann commented on LOG4J2-3113: -------------------------------------- Special treatment of {{StringBuilderFormattable}}. {{log4j2}} calls {{formatTo}} not {{toString}} on objects of type {{StringBuilderFormattable}}: {code:java} java.util.function.Supplier<String> supplier = new java.util.function.Supplier<>() { @Override public String get() {return "Supplier.get";} @Override public String toString() {return "Supplier.toString";} }; org.apache.logging.log4j.util.StringBuilderFormattable sbf = new org.apache.logging.log4j.util.StringBuilderFormattable() { @Override public void formatTo(StringBuilder _sb) {_sb.append("StringBuilderFormattable.formatTo");} @Override public String toString() {return "StringBuilderFormattable.toString";} }; Logger logger = System.getLogger(StringBuildersSample.class.getName()); logger.log(Level.INFO, "Sample log: Supplier={}, StringBuilderFormattable={}", supplier, sbf); {code} yields this log: {noformat} INFO [main] Sample log: Supplier=Supplier.toString, StringBuilderFormattable=StringBuilderFormattable.formatTo{noformat} > 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)