带有 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()
}
希望这对您有所帮助。
我已经为日志创建了一个扩展函数:
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()
}
希望这对您有所帮助。