kotlin logging с лямбда-параметрами

В log4j2 у нас есть удобная функция, которая описывается как

// 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()); 

моя попытка использовать это в котлине

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

который будет печатать

 random Function0<java.util.UUID> 

Как мы используем логдард-аргумент с котлином? Или как явным образом расскажу kotlin, какой метод назвать?

    Проблема в том, что debug() перегружен и имеет другой метод, который принимает объект vararg как аргумент. Котлин выбирает эту перегрузку, а не тот, кто принимает Supplier<?> Как аргумент, потому что он не знает, что выражение лямбда должно быть Поставщиком.

    Просто укажите его как поставщика:

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

    Я написал класс, который очень полезен для использования … Чтобы мы могли писать такие вещи, как

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

    что эквивалентно ленивому лямбда-каротажу, как

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

    Вам даже не нужны эти {} для параметризации строки, и у вас есть все исходные методы регистрации, так как это делегат …

    вот класс для тех, кто хотел бы использовать его …

     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() }) } } 

    или если вы хотите использовать превосходные ссылки на источник в журналах, вы можете сделать

     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() }) } }