logging de kotlin con parameters lambda

En log4j2 tenemos una característica útil que se describe como

// Java-8 style optimization: no need to explicitly check the log level: // the lambda expression is not evaluated if the TRACE level is not enabled logger.trace("Some long-running operation returned {}", () -> expensiveOperation()); 

mi bash de usar esto en kotlin

 log.debug("random {}", { UUID.randomUUID() }) 

que se imprimirá

 random Function0<java.util.UUID> 

¿Cómo usamos el logging de arguments lambda con kotlin? ¿O cómo le decimos explícitamente a kotlin qué método llamar?

    El problema es que debug() está sobrecargado y tiene otro método que toma un object vararg como argumento. Kotlin elige esa sobrecarga en lugar de la que toma como argumento al Supplier<?> Porque no sabe que se supone que la expresión lambda es un Proveedor.

    Solo especifíquelo como Proveedor:

     log.debug("random {}", Supplier { UUID.randomUUID() }) 

    He escrito una class que hace que sea muy divertido de usar … Para que podamos escribir cosas como

     log.debug { "some $thing is $that" } 

    que es equivalente a la lentitud de la registración lambda como

     log.debug("some {} is {}", ()->thing, ()->that) 

    Ni siquiera necesita estos {} para parametrizar la cadena, y tiene todos los methods de logging originales, ya que es un delegado …

    esta es la class para cualquiera que quiera usarla …

     import org.apache.logging.log4j.util.Supplier class Logger(private val logger: org.apache.logging.log4j.Logger) : org.apache.logging.log4j.Logger by logger { fun info(supplier: () -> String) { logger.info(Supplier { supplier.invoke() }) } fun debug(supplier: () -> String) { logger.debug(Supplier { supplier.invoke() }) } fun warn(supplier: () -> String) { logger.warn(Supplier { supplier.invoke() }) } fun error(supplier: () -> String) { logger.error(Supplier { supplier.invoke() }) } fun trace(supplier: () -> String) { logger.trace(Supplier { supplier.invoke() }) } } 

    o si desea aprovechar references increíbles a la fuente en los loggings que puede hacer

     import org.apache.logging.log4j.util.Supplier class Logger(val logger: org.apache.logging.log4j.Logger) : org.apache.logging.log4j.Logger by logger { inline fun info(crossinline supplier: () -> String) { logger.info(Supplier { supplier.invoke() }) } inline fun debug(crossinline supplier: () -> String) { logger.debug(Supplier { supplier.invoke() }) } inline fun warn(crossinline supplier: () -> String) { logger.warn(Supplier { supplier.invoke() }) } inline fun error(crossinline supplier: () -> String) { logger.error(Supplier { supplier.invoke() }) } inline fun trace(crossinline supplier: () -> String) { logger.trace(Supplier { supplier.invoke() }) } }