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

Posted

技术标签:

【中文标题】Kotlin 使用 slf4j 进行日志记录的最佳方式【英文标题】:Kotlin best way to log using slf4j 【发布时间】:2020-01-03 18:53:31 【问题描述】:

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

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

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

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

使用 Spring Boot 登录 Kotlin 的更好方法是什么?

【问题讨论】:

【参考方案1】:

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

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

两者兼得。

【讨论】:

我得到了 lambda 的优势,可以延迟字符串连接和 toString 调用,直到实际需要。但是 String 模板的(性能)优势是什么?还是仅仅是可读性? 重点是在logger.info("Get user paginated: filter $user")中使用字符串模板会带来性能dis的优势;在 Kotlin-Logging 中它没有。因此,您既获得了字符串模板的可读性优势,又获得了在不需要时不构造消息的性能优势。【参考方案2】:

SLF4J 支持的 语法的要点是避免在日志消息从未实际生成的情况下(例如因为级别高于信息)进行无用的字符串连接和 toString() 调用。

模板字符串不能避免这种情况:需要调用user.toString() 方法,并且需要将其结果附加到日志消息的静态部分,然后再传递给logger.info()

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

【讨论】:

【参考方案3】:

如果您不想将 Slf4j 模板与 一起使用,并且如果您不想添加额外的依赖项,则可以将 my simple kotlin-slf4j-extension 添加到您的项目中以有效地支持 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 

【讨论】:

以上是关于Kotlin 使用 slf4j 进行日志记录的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

Java 基础学习总结(203)—— 生成唯一 ID 打印日志记录最佳实践

Java 基础学习总结(203)—— 生成唯一 ID 打印日志记录最佳实践

Java 基础学习总结(203)—— 生成唯一 ID 打印日志记录最佳实践

使用 jdk 进行 slf4j 日志记录 – 如何启用调试?

使用 jboss/wildfly 10 进行 SLF4J 日志记录

如何在 Hibernate 4 中配置日志记录以使用 SLF4J