【问题标题】:Kotlin best way to log using slf4jKotlin 使用 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 的更好方法是什么?

【问题讨论】:

    标签: spring-boot logging kotlin slf4j


    【解决方案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 {}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-27
        • 2016-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-06
        • 1970-01-01
        相关资源
        最近更新 更多