使用 lambda 参数的 kotlin 日志记录

kotlin logging with lambda parameters

在 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 参数日志记录?或者我们如何显式地告诉kotlin调用什么方法?

问题是 debug() 重载了,并且有另一种方法将可变参数对象作为参数。 Kotlin 选择该重载而不是将 Supplier<?> 作为参数的重载,因为它不知道 lambda 表达式应该是 Supplier.

只需将其指定为供应商:

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

查看 https://github.com/MicroUtils/kotlin-logging。它还提供这些功能:

一个使用 Kotlin 扩展包装 slf4j 的方便且高性能的日志记录库。

调用日志方法,不检查相应日志级别是否启用:

logger.debug { "Some $expensive message!" }

如果未启用调试,在幕后不会评估昂贵的消息:

if (logger.isDebugEnabled) logger.debug("Some $expensive message!")

定义记录器,不显式指定 class 名称:

// Place definition above class declaration to make field static  
private val logger = KotlinLogging.logger {}