方便的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) }