方便的Kotlin LoggerFactory简化

使用kotlin使用SLF4J或其他日志记录方法最方便的方法是什么?

通常开发人员正忙于样板代码

private val logger: Logger = LoggerFactory.getLogger(this::class.java) 

在每一个class级得到一个适当的记录器?

用Kotlin统一/简化这个最简便的方法是什么?

下面是一个简单的例子,它从绑定的可调用引用或标准属性返回一个懒惰初始化的记录器。 我更喜欢从可调用引用调用,因为::表示reflection(与记录有关)。

提供Lazy

 class LoggingProvider(val clazz: KClass) { operator fun provideDelegate(inst: Any?, property: KProperty<*>) = lazy { LoggerFactory.getLogger(clazz.java) } } 

内联函数来调用它们:

 inline fun  KCallable.logger() = LoggingProvider(T::class) inline fun  T.logger() = LoggingProvider(T::class) 

这里有一个使用它们的例子。 初始化程序中的require声明显示记录器共享一个引用:

 class Foo { val self: Foo = this val logger by this.logger() val callableLogger by this::self.logger() init { require(logger === callableLogger) } } 

你可以在每个types上定义一个扩展属性:

 val  T.logger: Logger get() = LoggerFactory.getLogger(this::class.java) 

使用它如下:

 class X { init { logger.debug("init") } } 

我在我的项目中定义了这个函数来为我定义一个记录器。 它利用了Kotlin的物化types。

 // Defined in Utilities.kt inline fun  logFor() = LoggerFactory.getLogger(T::class.java) 

用法:

 class MyClass { private val log = logFor() ... } 

或者如果你正在创造很多:

 class MyClass { companion object { private val log = logFor() } ... } 

如果你不喜欢样板,你可以用自己的logger helper来包装log.info

 mylog.info(this, "data that needs to be logged") 

然后在后台,有一些hashmap跟踪this参数的类,可以实例化该类的记录器。

其他选项可能是使用AspectJ Weaving编写每个类的记录器,但这在我看来是矫枉过正。

我已经为此定义了一个实用方法

 fun getLogger(cl: KClass<*>): Logger { return LoggerFactory.getLogger(cl.java)!! } 

现在在每个class级我都可以使用这样的记录器

 companion object { private val logger = getLogger(MyClass::class) }