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