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,這樣才能傳遞給後面的getLogger,T::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.4k的star:
依賴如下:
<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官網-內聯函數
到此這篇關於Kotlin中日志使用方法的文章就介紹到這瞭,更多相關Kotlin日志使用內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!