【发布时间】:2020-09-10 12:11:21
【问题描述】:
我正在尝试为 KLogger/Logger 创建一个扩展,它是 slf4j 记录器的扩展,以便更好地处理结构化日志消息。有人可以解释我的代码有什么问题以及如何在不传递我的记录器对象的情况下修复它或解决它吗?我的扩展永远不会被调用。
下面你可能会看到极简的 build.gradle + sn-p 代码:
App.kt:
import mu.KLogger
import mu.KotlinLogging
private val log = KotlinLogging.logger {}
fun main() {
log.info("log message",
"key1" to "value1",
"key2" to "value2"
)
}
fun KLogger.info(message: String, vararg keyValues: Pair<String, Any?>) {
log.info("log extension")
info(message)
}
build.gradle.kts:
plugins {
kotlin("jvm") version "1.3.72"
}
group = "rg"
version = "1.0"
java.sourceCompatibility = JavaVersion.VERSION_11
repositories {
mavenCentral()
}
dependencies {
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
implementation("ch.qos.logback:logback-classic:1.2.3")
implementation("io.github.microutils:kotlin-logging:1.7.6")
}
更新: 我最终放弃了扩展想法并将现有代码转换为委托。
fun structuredLogger(func: () -> Unit): StructuredLogger = StructuredLogger(func)
class StructuredLogger(func: () -> Unit, private val log: KLogger = KotlinLogging.logger(func)) : KLogger by log {
fun info(msg: String?, vararg keyValues: Pair<LoggingKey, Any?>) {
log.info(marker(*keyValues), msg)
}
// (...)
}
【问题讨论】:
-
KLogger是否有具有完全相同签名的实例方法?在这种情况下,扩展程序将不起作用。 -
Logger 有这些:public void info(String format, Object arg1, Object arg2); public void info(String format, Object... arguments);
标签: kotlin logging kotlin-extension