我创建了一个用于记录日志的扩展函数:
import org.slf4j.LoggerFactory
fun Any.log(msg: String) {
LoggerFactory.getLogger(javaClass.name).debug(msg)
}
但我不确定在调用LoggerFactory.getLogger
方法时会不会初始化,因为它会调用getILoggerFactory
方法。
也许已经有人做过这样的事情并且可以保证它不会有任何内存泄漏 :) ?
目前我使用传统的方式(在类中声明logger字段):
companion object {
private val logger = LoggerFactory.getLogger(LoggerTest::class.java.name)
}
但是像这样的一个简单的单元
测试:
@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
I'm using:
org.slf4j - 1.7.25
ch.qos.logback - 1.2.3
LoggerFactory.getLogger(...)
没有每次都构建一个新的记录器(logger),而是能够重复使用它们,但正如这个答案中所说,这些调用并不是免费的,所以你不应该这样做。 - hotkeyAny.foo() { do sth with javaClass }
并像这样调用它String.foo()
,那么javaClass
应该是String
或Any
(我不确定),但绝对不是调用类。然而,与老式方法相比,这并不能给您相同的结果。 - msrd0interface HasLogger { val logger : Logger }
并定义HasLogger.log()
。尽管这仍然需要每个实例一个记录器,而不是每个类一个记录器。 - msrd0