1 引言

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

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

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

2 入手写@Slf4j

很简略,先上代码:

import org.slf4j.Loggerimport 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@Slf4jclass 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.KotlinLoggingprivate 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.KotlinLoggingimport 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官网-内联函数