Kotlin扩展日志功能与logback(slf4j)

我为记录创建了一个扩展函数:

import org.slf4j.LoggerFactory fun Any.log(msg: String) { LoggerFactory.getLogger(javaClass.name).debug(msg) } 

但是我不确定在任何时候它会被调用,因为方法LoggerFactory.getLogger调用getILoggerFactory

MB有人已经做了这样的事情,可以向我保证,这不会是任何内存泄漏:)?

现在我用老式的方法(在一个类中声明记录器字段):

 companion object { private val logger = LoggerFactory.getLogger(LoggerTest::class.java.name) } 

但像这样一个简单的unit测试:

 @Test fun testLogger() { val start = System.currentTimeMillis() for (i in 0..999) { log("i=" + i) } val end = System.currentTimeMillis() val time = end - start println("*** TIME=" + time.toDouble() / 1000 + " sec") } 

显示与旧时尚选项相同的结果:

 @Test fun testLogger() { val start = System.currentTimeMillis() for (i in 0..999) { logger.debug("i=" + i) } val end = System.currentTimeMillis() val time = end - start println("*** TIME=" + time.toDouble() / 1000 + " sec") } companion object { private val logger = LoggerFactory.getLogger(LoggerTest::class.java.name) } 

*** TIME=0.02 sec

我在用着:

 org.slf4j - 1.7.25 ch.qos.logback - 1.2.3 

为了记录,我可以推荐另一种解决方案。

首先添加接口ILogging和类LoggingImpl:

 interface ILogging { val log: Logger } class LoggingImp(loggerImpl: Logger) : ILogging { override val log: Logger = loggerImpl companion object { operator inline fun <reified T> invoke(): LoggingImp { return LoggingImp(LoggerFactory.getLogger(T::class.java)) } } } 

现在,您可以使用Kotlin代表团将记录器添加到任何课程:

 class TestClass : ILogging by LoggingImp<TestClass>() { fun test() { log.info("test") } } 

记录器将在创建父对象时创建。 使用示例:

 fun main(args: Array<String>) { val testClass = TestClass() testClass.test() } 

希望这会帮助你。

更简单的解决方案是使用默认方法的接口。

 interface ILogger { @get:JsonIgnore val logger: Logger get() = LoggerFactory.getLogger(this) } 

然后像这样使用它:

 class TestClass : ILogging { fun test() { logger.info("test") } }