什么是一种习惯性的Kotlin方式来获得记录器?

我期待取代

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()调用每个用法(不可接受)也返回一个记录器的子types(而不是它声明的)。

您可以创建一个实用程序方法

 inline fun  loggerFor() = LoggerFactory.getLogger(T::class.java) 

并简单地使用它

 class MyClass { companion object { val log = loggerFor() } fun usage() { log.debug("Success") } } 

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

 private val log = loggerFor() class MyClass { fun usage() { log.debug("Success") } } 

首先,您可以为记录器创建添加扩展function。

 inline fun  getLogger() = LoggerFactory.getLogger(T::class.java) fun  T.getLogger() = LoggerFactory.getLogger(javaClass) 

然后你将能够使用下面的代码创建一个记录器。

 private val logger1 = getLogger() private val logger2 = getLogger() 

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

 interface LoggerAware { val logger: Logger } class LoggerAwareMixin(containerClass: Class<*>) : LoggerAware { override val logger: Logger = LoggerFactory.getLogger(containerClass) } inline fun  loggerAware() = LoggerAwareMixin(T::class.java) 

这个接口可以用下面的方式。

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