Kotlin 使用 slf4j 进行日志记录的最佳方式

问题描述 投票:0回答:4

我有一个使用 logback 的默认日志配置的 Spring Boot 项目。我一直在我的应用程序中使用这种方法进行日志记录:

logger.info("Get user paginated: filter {}",user)

现在我正在学习 Kotlin,并且正在阅读有关字符串模板的内容。如果我使用 $ 重写我的句子将是:

logger.info("Get user paginated: filter $user")

使用 Spring boot 登录 Kotlin 的更好方式是什么?

spring-boot logging kotlin slf4j
4个回答
31
投票

两者都不是更好的方法;添加 https://github.com/MicroUtils/kotlin-logging 并编写

logger.info { "Get user paginated: filter $user" }

兼具两者的优点。


12
投票

SLF4J 支持的

{}
语法的要点是,如果日志消息从未实际生成(例如,因为级别高于 info),则可以避免无用的 String 连接和 toString() 调用。

模板字符串不能避免这种情况:需要调用

user.toString()
方法,并且其结果需要附加到日志消息的静态部分,然后再传递给
logger.info()

因此,如果您正在寻找最佳性能,请使用 SL4J 参数。如果您不关心并且发现模板字符串更具可读性,请使用模板字符串。


4
投票

如果您不想将 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 {}

1
投票
private val logger = LoggerFactory.getLogger(this::class.java)
fun testing() {
      logger.info(ctx.toString())
      logger.error(err.message)
}
© www.soinside.com 2019 - 2024. All rights reserved.