gpt4 book ai didi

Kotlin 扩展日志函数与 logback(slf4j)

转载 作者:行者123 更新时间:2023-12-02 06:24:29 25 4
gpt4 key购买 nike

我创建了一个用于日志记录的扩展函数:

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)
}

但是一个简单的单元测试如下:

@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)
}

~ *** 时间=0.02 秒

我正在使用:

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

最佳答案

对于日志记录,我可以推荐另一种解决方案。

首先,添加接口(interface)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 委托(delegate)将记录器添加到任何类:

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

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

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

testClass.test()
}

希望这会对您有所帮助。

关于Kotlin 扩展日志函数与 logback(slf4j),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46930386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com