Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何让kotlin日志(MicroUtils)打印到子类名称而不是抽象类名称?_Kotlin_Logging_Slf4j_Kotlin Logging - Fatal编程技术网

如何让kotlin日志(MicroUtils)打印到子类名称而不是抽象类名称?

如何让kotlin日志(MicroUtils)打印到子类名称而不是抽象类名称?,kotlin,logging,slf4j,kotlin-logging,Kotlin,Logging,Slf4j,Kotlin Logging,我使用的是kotlin logging(),我希望我的记录器打印到子类名称而不是抽象类名称。例如,我有这些课程 // in A.kt file: import mu.KotlinLogging private val logger = KotlinLogging.logger {} abstract class A<T> { fun someMethod(item: T?) { logger.info("testing") } } fun

我使用的是kotlin logging(),我希望我的记录器打印到子类名称而不是抽象类名称。例如,我有这些课程

// in A.kt file:

import mu.KotlinLogging

private val logger = KotlinLogging.logger {}

abstract class A<T> {
    fun someMethod(item: T?) {
        logger.info("testing")
    }
}



fun main() {
    val b: A<String> = B()
    b.someMethod("123")
}




// in B.kt file

import mu.KotlinLogging

private val logger = KotlinLogging.logger {}

class B : A<String>() {
}
//在.kt文件中:
导入mu.KotlinLogging
private val logger=KotlinLogging.logger{}
抽象A类{
有趣的方法(项目:T?){
logger.info(“测试”)
}
}
主要内容(){
val b:A=b()
b、 somethod(“123”)
}
//在B.kt文件中
导入mu.KotlinLogging
private val logger=KotlinLogging.logger{}
B类:A(){
}
它打印:[main]信息A-测试


但是我希望它打印:[main]INFO B-testing(其中B是子类名称)

您可能希望将记录器发送到抽象类

// in A.kt file:

import mu.KotlinLogging

abstract class A<T>(private val logger: KLogger) {
    fun someMethod(item: T?) {
        logger.info("testing")
    }
}



fun main() {
    val b: A<String> = B()
    b.someMethod("123")
}




// in B.kt file

import mu.KotlinLogging

private val logger = KotlinLogging.logger {}

class B : A<String>(logger) {
}
//在.kt文件中:
导入mu.KotlinLogging
抽象A类(专用val记录器:KLogger){
有趣的方法(项目:T?){
logger.info(“测试”)
}
}
主要内容(){
val b:A=b()
b、 somethod(“123”)
}
//在B.kt文件中
导入mu.KotlinLogging
private val logger=KotlinLogging.logger{}
B类:A(记录器){
}

结果:
[main]INFO B-测试

如果记录器在抽象类A中,则可以使用记录器(名称:String)方法而不是记录器(func:()->Unit)方法,如下所示:

// in A.kt file

import mu.KotlinLogging

abstract class A<T> {
    private val logger = KotlinLogging.logger("${this::class.java.name}")

    fun someMethod(item: T?) {
        logger.info("testing")
    }
}

fun main() {
    val b: A<String> = B()
    b.someMethod("123")
}

// in B.kt file

class B : A<String>() {
}
结果是
AKt$funcJavaClass$1
,因此当我们在此处切片名称时: 结果就是
A

还值得注意的是,原始示例使用
A
,是因为文件名是A,而不是因为类

// in R.kt

import mu.KotlinLogging

private val funcJavaClass: String = {}.javaClass.name

abstract class A<T> {
    private val logger = KotlinLogging.logger("${this::class.java.name}")

    fun someMethod(item: T?) {
        logger.info("$funcJavaClass")
        logger.info("testing")
    }
}

结果:
A$funcJavaClass$1

打印抽象类通常是更好的做法,因为日志记录器应该清楚地指示日志打印的位置。
// in R.kt

import mu.KotlinLogging

private val funcJavaClass: String = {}.javaClass.name

abstract class A<T> {
    private val logger = KotlinLogging.logger("${this::class.java.name}")

    fun someMethod(item: T?) {
        logger.info("$funcJavaClass")
        logger.info("testing")
    }
}
// in R.kt

import mu.KotlinLogging

abstract class A<T> {
    private val logger = KotlinLogging.logger("${this::class.java.name}")
    private val funcJavaClass: String = {}.javaClass.name

    fun someMethod(item: T?) {
        logger.info("$funcJavaClass")
        logger.info("testing")
    }
}