在Kotlin中使用Lombok的@slf4j注释

7

有没有一种类似于Lombok的注解@slf4j在Kotlin中使用的方式?

目前,我有一个扩展函数可以为我实例化一个Logger Factory,我必须像下面的示例一样在每个类中创建这些变量:

@RestController
@RequestMapping("/api/v1/sample")
class SampleController() {
    private val log = logger()

    @GetMapping
    fun show(): String {
        log.info("SOME LOGGING MESSAGE")
        return "OK"
    }
}

inline fun <reified T> T.logger(): Logger {
    if (T::class.isCompanion) {
        return LoggerFactory.getLogger(T::class.java.enclosingClass)
    }
    return LoggerFactory.getLogger(T::class.java)
}

我想要达到的目标是类似于以下内容:
@Logger
@RestController
@RequestMapping("/api/v1/sample")
class SampleController() {
    @GetMapping
    fun show(): String {
        log.info("SOME LOGGING MESSAGE")
        return "OK"
    }
}

必须使用注释吗?我们使用 Kotlin Logging(https://github.com/MicroUtils/kotlin-logging),它允许在类定义的正上方放置一个静态字段: private val logger = KotlinLogging.logger {} 然后您可以像想要的那样在类中使用此记录器。 - Danny Lagrouw
2个回答

7

昨天制作了这个漂亮的东西

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Log {
    companion object {
        inline var <reified T> T.log: Logger
            get() = LoggerFactory.getLogger(T::class.java)
            set(value) {}
    }
}

不要使用上面那个混乱的东西。使用

companion object {
    private val log: Logger = LoggerFactory.getLogger(this::class.java)
}

请查看Kotlin中记录日志的惯用方式


第一个为什么不起作用的原因是什么? - Francis Fredrick Valero
@FrancisFredrickValero 这个代码可以正常工作,但允许使用 AnyType.log(),这样会造成混乱,而它的可访问性并不能弥补这种混乱。任何类也都可以访问这个方法,所以注释部分是多余的。 - Amund

1
将Danny Lagrouw的评论转化为答案:
你可以使用Micro Utils' kotlin-logging来获得类似于@Slf4j的低样板文件解决方案,而不需要手动指定类。
import mu.KotlinLogging

private val log = KotlinLogging.logger {}

class LoggingDemoClass() {

  fun logSometing() {
    log.info("Logging like a pro!")
  }
}


注意:我刚开始使用它,还没有研究它在 Slf4j 之上添加的任何 Kotlin 语法糖,但到目前为止,它似乎足以作为 Kotlin 代码中 @Slf4j 的即插即用替代品。

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