关于kotlin:关于Kotlin中日志的使用方法

1 引言

想必学过Java的人都晓得一个@Slf4j应用得如许的难受:

@Slf4j
public class TestController{
    @GetMapping("/test")
    public String test(){
        log.debug("debug");        
        return "test";
    }
}

然而很可怜在Kotlin中并没有这种注解,因而,本文给出了一种相似@Slf4j注解在Kotlin中的应用办法,以及介绍一个100%应用Kotlin编写的日志库。

2 入手写@Slf4j

很简略,先上代码:

import org.slf4j.Logger
import org.slf4j.LoggerFactory

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Slf4j{
    companion object{
        val <reified T> T.log: Logger
        inline get() = LoggerFactory.getLogger(T::class.java)
    }
}

逐行解释如下:

  • @Target:与Java中的@Target相似,注解的指标,这里是类
  • @Retention:与Java中的@Retention相似,运行时保留
  • annotation class:申明一个注解
  • companion object:伴生对象
  • val <reified T> T.log:Logger:申明一个Logger类型的泛型对象
  • inline get() = LoggerFactory.getLogger(T::class.java):申明getter为内联,申明为内联能力应用T,这样能力传递给前面的getLoggerT::class.java相当于Java中的T.class,也就是getLogger(T::class.java)相当于getLogger(SomeClass.class)

应用很简略:

@RestController
@Slf4j
class TestController {
    @GetMapping("/test")
    fun test():String{
        log.warn("cc")
        return "test"
    }
}

间接类上加一个注解,就能够应用log.info/log.warn之类的办法了。

3 kotlin-logging

下面介绍了注解的应用办法,如果不想应用注解的话,能够应用他人的库,比方kotlin-logging

kotlin-logging是一个100%应用Kotlin编写的轻度封装了slf4j的开源日志库,曾经播种1.4kstar

依赖如下:

<dependency>
    <groupId>io.github.microutils</groupId>
    <artifactId>kotlin-logging-jvm</artifactId>
    <version>2.0.6</version>
</dependency>

Gradle

implementation 'io.github.microutils:kotlin-logging-jvm:2.0.6'

引入时,只须要在对应的类中创立一个属性即可:

private val logger = KotlinLogging.logger {}

应用时,间接调用其中的info/debug/error等即可:

import mu.KotlinLogging
private val logger = KotlinLogging.logger {} 
class FooWithLogging {
    val message = "world"
    fun bar() {
        logger.debug { "hello $message" }
    }
}

4 两者联合应用

当然,也能够将注解与kotlin-logging联合一下应用,首先,笔者简略地看了一下KotlinLogging的接口:

提供了三个对外的logger办法,参数别离是:

  • 函数
  • 字符串
  • org.slf4j.Logger

对外没有提供相似getLogger(Class<?> clazz)这样的用类作为参数的办法,因而,须要通过泛型获取到具体类的名字并应用第二种办法结构mu.KLogger

import mu.KotlinLogging
import org.slf4j.Logger

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class Slf4j{
    companion object{
        val <reified T> T.log: Logger
        inline get() = KotlinLogging.logger{T::class.java.name}
    }
}

应用办法同上,间接加一个@Slf4j即可应用。

5 残缺Demo参考

  • Github
  • 码云
  • CODE.CHINA

6 参考

1、kotlin-logging

2、Kotlin官网-内联函数

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理