1

我正在寻找更换

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")
    }
}

不必在每节课上都加分的奖励积分。

我试过了:

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

但这会导致每次使用(不可接受)的 getLogger() 调用也会返回子类型的记录器(不是声明它的那个)。

4

2 回答 2

1

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

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.
}
于 2016-06-08T09:34:32.810 回答
1

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

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")
    }
}
于 2016-06-08T09:28:15.703 回答