用lambda参数记录kotlin

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

我试图在kotlin中使用它

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

将打印

 random Function0<java.util.UUID> 

我们如何使用kotlin使用lambda参数记录? 或者我们如何明确地告诉科特林要调用什么方法?

问题是debug()被重载,并且有另一个方法把可变参数作为参数。 Kotlin选择超载而不是以Supplier<?>为参数的那个,因为它不知道lambda表达式应该是供应商。

只需指定它作为供应商:

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

我已经写了一个类,使得这个有趣的使用…所以我们可以写的东西

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

这相当于懒惰的lambda日志记录

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