带回送功能的Kotlin扩展日志功能(slf4j)

use*_*934 5 logback slf4j kotlin extension-function

我已经创建了用于记录日志的扩展功能:

import org.slf4j.LoggerFactory

fun Any.log(msg: String) {
    LoggerFactory.getLogger(javaClass.name).debug(msg)
}
Run Code Online (Sandbox Code Playgroud)

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

MB已经有人做过类似的事情,可以向我保证不会有任何内存泄漏:)吗?

现在我使用老式的方法(在类中声明logger字段):

companion object {
    private val logger = LoggerFactory.getLogger(LoggerTest::class.java.name)
}
Run Code Online (Sandbox Code Playgroud)

但是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")
}
Run Code Online (Sandbox Code Playgroud)

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

@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)
}
Run Code Online (Sandbox Code Playgroud)

〜 *** TIME=0.02 sec

我正在使用:

org.slf4j - 1.7.25
ch.qos.logback - 1.2.3
Run Code Online (Sandbox Code Playgroud)

kur*_*urt 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))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以使用 Kotlin 委托将记录器添加到任何类:

class TestClass : ILogging by LoggingImp<TestClass>() {
    fun test() {
        log.info("test")
    }
}
Run Code Online (Sandbox Code Playgroud)

Logger 将在创建父对象时创建。使用示例:

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

    testClass.test()
}
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助。