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

CRI*_*ANZ 7 logging slf4j kotlin spring-boot

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

logger.info("Get user paginated: filter {}",user)
Run Code Online (Sandbox Code Playgroud)

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

logger.info("Get user paginated: filter $user")
Run Code Online (Sandbox Code Playgroud)

哪个是使用 Spring Boot 登录 Kotlin 的更好方法?

Ale*_*nov 11

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

logger.info { "Get user paginated: filter $user" }
Run Code Online (Sandbox Code Playgroud)

兼具两者的优点。

  • 要点是,在 `logger.info("Get user pagination: filter $user")` 中使用字符串模板具有性能优势;在 Kotlin-Logging 中则不然。因此,您既可以获得字符串模板的可读性优势,又可以获得不需要时不构造消息的性能优势。 (5认同)
  • 我利用了 lambda 的优势,将字符串连接和 toString 调用延迟到实际需要时为止。但是 String 模板的(性能)优势是什么?或者只是为了可读性? (2认同)

JB *_*zet 8

{}SLF4J 支持的语法要点是避免无用的字符串连接和 toString() 调用,如果日志消息从未真正生成(例如因为级别高于 info.txt)。

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

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