使用 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 {}
在 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 {}