在Kotlin中从Lombok实现@slf4j注解

z2acfund  于 2022-11-25  发布在  Kotlin
关注(0)|答案(2)|浏览(436)

有没有办法用Kotlin中的注解类实现类似于Lombok的注解@slf4j的东西?
现在我有一个扩展函数,它为我示例化了一个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"
    }
}
jchrr9hc

jchrr9hc1#

我昨天做了这个漂亮的东西

@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中的惯用登录方式

7lrncoxx

7lrncoxx2#

将Danny Lagrouw的评论转化为答案:
您可以获得一个类似于@Slf4j的简单样板解决方案,它不需要您使用Micro Utils' kotlin-logging手动指定类

import mu.KotlinLogging

private val log = KotlinLogging.logger {}

class LoggingDemoClass() {

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

警告:我刚刚开始使用它,但是还没有研究它放在Slf4j上面的任何Kotlin糖,但是到目前为止,它作为kotlin代码中@Slf4j的一个直接替代品似乎处理得足够好。

相关问题