關於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參考

6 參考

1、kotlin-logging

2、Kotlin官網-內聯函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章