我有一个使用 logback 的默认日志配置的 Spring Boot 项目。我一直在我的应用程序中使用这种方法进行日志记录:
logger.info("Get user paginated: filter {}",user)
现在我正在学习 Kotlin,并且正在阅读有关字符串模板的内容。如果我使用 $ 重写我的句子将是:
logger.info("Get user paginated: filter $user")
使用 Spring boot 登录 Kotlin 的更好方式是什么?
两者都不是更好的方法;添加 https://github.com/MicroUtils/kotlin-logging 并编写
logger.info { "Get user paginated: filter $user" }
兼具两者的优点。
SLF4J 支持的
{}
语法的要点是,如果日志消息从未实际生成(例如,因为级别高于 info),则可以避免无用的 String 连接和 toString() 调用。
模板字符串不能避免这种情况:需要调用
user.toString()
方法,并且其结果需要附加到日志消息的静态部分,然后再传递给 logger.info()
。
因此,如果您正在寻找最佳性能,请使用 SL4J 参数。如果您不关心并且发现模板字符串更具可读性,请使用模板字符串。
如果您不想将 Slf4j 模板与
{}
一起使用,并且不想添加额外的依赖项,则可以将 我的简单 kotlin-slf4j-extension 添加到您的项目中:
package org.slf4j
import org.slf4j.LogLevel.*
enum class LogLevel { TRACE, DEBUG, INFO, WARN, ERROR }
fun Logger.trace(throwable: Throwable? = null, messageProducer: () -> Any?) = log(TRACE, throwable, messageProducer)
fun Logger.debug(throwable: Throwable? = null, messageProducer: () -> Any?) = log(DEBUG, throwable, messageProducer)
fun Logger.info(throwable: Throwable? = null, messageProducer: () -> Any?) = log(INFO, throwable, messageProducer)
fun Logger.warn(throwable: Throwable? = null, messageProducer: () -> Any?) = log(WARN, throwable, messageProducer)
fun Logger.error(throwable: Throwable? = null, messageProducer: () -> Any?) = log(ERROR, throwable, messageProducer)
fun Logger.log(level: LogLevel, throwable: Throwable?, messageProducer: () -> Any?) {
if (when (level) { // is enabled
TRACE -> isTraceEnabled
DEBUG -> isDebugEnabled
INFO -> isInfoEnabled
WARN -> isWarnEnabled
ERROR -> isErrorEnabled
}) {
val message = messageProducer()?.toString()
when (level) { // delegate to slf4j implementation
TRACE -> trace(message, throwable)
DEBUG -> debug(message, throwable)
INFO -> info(message, throwable)
WARN -> warn(message, throwable)
ERROR -> error(message, throwable)
}
}
}
比你可以有效地使用这种 kotlin 风格:
private val log = LoggerFactory.getLogger(this.javaClass)
fun log() {
log.trace { "trace message" }
log.debug { "debug message" }
log.info { "info message" }
log.warn { "warn message" }
log.error { "error message" }
log.error(IllegalStateException("throwable message")) { "exception" }
}
Slf4k 是一种不使用 kotlin 扩展的替代实现。
val log = Slf4k.getLogger {}
private val logger = LoggerFactory.getLogger(this::class.java)
fun testing() {
logger.info(ctx.toString())
logger.error(err.message)
}