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 日志记录 – 如何启用调试?