获取 Logger 的惯用 Kotlin 方法是什么?

What is an idiomatic Kotlin way to aquire a Logger?

我想更换

private static final Logger log = Logger.getLogger(MyClass.class);

然后使用一些不那么冗长和更惯用的东西

class MyClass {
    companion object {
        val log = LoggerFactory.getLogger(MyClass::class.java)
    }

    fun usage() {
        log.debug("Success")
    }
}

不必在每个 class.

中删除它的奖励积分

我试过了:

interface HasLogger {
    val log: Logger
        get() = LoggerFactory.getLogger(this.javaClass)
}

但这会导致每次使用时都会调用 getLogger()(不可接受),还会 returns 子类型(不是声明它的那个)的记录器。

您可以创建一个实用方法,例如

inline fun <reified T:Any> loggerFor() = LoggerFactory.getLogger(T::class.java)

并且像

一样简单地使用它
class MyClass {
    companion object {
        val log = loggerFor<MyClass>()
    }

    fun usage() {
        log.debug("Success")
    }
}

或者,您可以使用文件级别的私有记录器,它可以节省您的一些输入,这似乎只是当您没有多个 类 每个文件都定义了自己的记录器时,这似乎是一个很好的解决方案:

private val log = loggerFor<MyClass>()

class MyClass {
    fun usage() {
        log.debug("Success")
    }
}

首先,您可以添加用于创建记录器的扩展函数。

inline fun <reified T : Any> getLogger() = LoggerFactory.getLogger(T::class.java)
fun <T : Any> T.getLogger() = LoggerFactory.getLogger(javaClass)

然后您就可以使用以下代码创建记录器了。

private val logger1 = getLogger<SomeClass>()
private val logger2 = getLogger()

其次,您可以定义一个提供记录器及其混合实现的接口。

interface LoggerAware {
  val logger: Logger
}

class LoggerAwareMixin(containerClass: Class<*>) : LoggerAware {
  override val logger: Logger = LoggerFactory.getLogger(containerClass)
}

inline fun <reified T : Any> loggerAware() = LoggerAwareMixin(T::class.java)

该接口可以通过以下方式使用

class SomeClass : LoggerAware by loggerAware<SomeClass>() {
  // Now you can use a logger here.
}