方便的Kotlin LoggerFactory简化

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

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

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

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

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

    5 Solutions collect form web for “方便的Kotlin LoggerFactory简化”

    下面是一个简单的例子,它从绑定的可调用引用或标准属性返回一个懒惰初始化的记录器。 我更喜欢从可调用引用调用,因为::表示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) } 
    Kotlin language will be the best programming language for Android.