【发布时间】:2017-10-25 10:47:17
【问题描述】:
我已经为日志创建了一个扩展函数:
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
【问题讨论】:
-
似乎
LoggerFactory.getLogger(...)不会每次都构造一个新的记录器并且能够重复使用它们,但是正如this answer 中所说,调用不是免费的,所以你不应该这样做。 -
也许还有另一个选项可以使用 logback 制作扩展 kotlin 功能?
-
如果您使用
Any.foo() { do sth with javaClass }并像String.foo()一样调用它,那么javaClass应该是String或Any(我不确定),但绝对不是调用类。但是,与老式方式相比,这不会给您相同的结果 -
实际上我可能会选择
interface HasLogger { val logger : Logger }并定义HasLogger.log()。虽然这仍然需要每个实例一个记录器,而不是每个类一个记录器
标签: kotlin logback slf4j extension-function