带有 logback(slf4j) 的 Kotlin 扩展日志功能

Kotlin extension log function with logback(slf4j)

我已经为日志创建了一个扩展函数:

import org.slf4j.LoggerFactory

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

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

Mb 有人已经做过类似的事情并且可以向我保证这不会是任何内存泄漏:) ?

现在我使用老式方法(在 class 中声明记录器字段):

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 和 class 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:

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

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

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

    testClass.test()
}

希望这对您有所帮助。