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

15

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

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

现在我正在学习 Kotlin,我正在阅读有关字符串模板的内容。如果我使用 $ 重写我的句子,它会变成:

现在我正在学习 Kotlin,我正在阅读有关字符串模板的内容。如果我使用 $ 重写我的句子,它会变成:

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

使用Spring Boot登录Kotlin,有哪种方法更好?


请参阅https://realjenius.com/2017/08/31/logging-in-kotlin/。 - undefined
4个回答

29

2
我利用lambda的优势,将字符串连接和toString调用延迟到实际需要时。但是字符串模板的(性能)优势是什么?或者只是可读性? - Jorn
4
重点是,在logger.info("Get user paginated: filter $user")中使用字符串模板会带来性能上的缺陷;而在Kotlin-Logging中则不会。因此,您既可以获得字符串模板的可读性优势,又可以获得在不需要构造消息时不构造消息的性能优势。 - Alexey Romanov

12
SLF4J支持的{}语法的目的是在日志消息实际未生成(例如因为级别高于info)时避免无用的字符串连接和toString()调用。
模板字符串并不能避免这一点:需要调用user.toString()方法,并将其结果附加到静态部分的日志消息中,然后再传递给logger.info()。
因此,如果您想要最佳性能,请使用SL4J参数。如果您不在乎性能,而更喜欢可读性更好的模板字符串,则使用模板字符串。

3

如果您不想使用带有{}的Slf4j模板,并且不想添加额外的依赖项,您可以将我的简单的kotlin-slf4j扩展添加到您的项目中,以有效地支持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 {}

0
private val logger = LoggerFactory.getLogger(this::class.java)
fun testing() {
      logger.info(ctx.toString())
      logger.error(err.message)
}

2
你的回答可以通过提供更多的支持信息来改进。请点击 [编辑] 添加更多细节,例如引用或文献,以便其他人可以确认你的回答是否正确。你可以在 帮助中心 中找到更多关于如何撰写良好回答的信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接