Kotlin中日志的使用方法詳解
1 引言
想必學(xué)過Java的人都知道一個(gè)@Slf4j使用得多么的舒服:
@Slf4j public class TestController{ @GetMapping("/test") public String test(){ log.debug("debug"); return "test"; } }
但是很不幸在Kotlin中并沒有這種注解,因此,本文給出了一種類似@Slf4j注解在Kotlin中的使用方法,以及介紹一個(gè)100%使用Kotlin編寫的日志庫。
2 動(dòng)手寫@Slf4j
很簡(jiǎn)單,先上代碼:
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類似,注解的目標(biāo),這里是類
- @Retention:與Java中的@Retention類似,運(yùn)行時(shí)保留
- annotation class:聲明一個(gè)注解
- companion object:伴生對(duì)象
- val <reified T> T.log:Logger:聲明一個(gè)Logger類型的泛型對(duì)象
- inline get() = LoggerFactory.getLogger(T::class.java):聲明getter為內(nèi)聯(lián),聲明為內(nèi)聯(lián)才能使用T,這樣才能傳遞給后面的getLogger,T::class.java相當(dāng)于Java中的T.class,也就是getLogger(T::class.java)相當(dāng)于getLogger(SomeClass.class)
使用很簡(jiǎn)單:
@RestController @Slf4j class TestController { @GetMapping("/test") fun test():String{ log.warn("cc") return "test" } }
直接類上加一個(gè)注解,就可以使用log.info/log.warn之類的方法了。
3 kotlin-logging
上面介紹了注解的使用方法,如果不想使用注解的話,可以使用別人的庫,比如kotlin-logging。
kotlin-logging是一個(gè)100%使用Kotlin編寫的輕度封裝了slf4j的開源日志庫,已經(jīng)收獲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'
引入時(shí),只需要在對(duì)應(yīng)的類中創(chuàng)建一個(gè)屬性即可:
private val logger = KotlinLogging.logger {}
使用時(shí),直接調(diào)用其中的info/debug/error等即可:
import mu.KotlinLogging private val logger = KotlinLogging.logger {} class FooWithLogging { val message = "world" fun bar() { logger.debug { "hello $message" } } }
4 兩者結(jié)合使用
當(dāng)然,也可以將注解與kotlin-logging結(jié)合一下使用,首先,筆者簡(jiǎn)單地看了一下KotlinLogging的接口:
提供了三個(gè)對(duì)外的logger方法,參數(shù)分別是:
- 函數(shù)
- 字符串
- org.slf4j.Logger
對(duì)外沒有提供類似getLogger(Class<?> clazz)這樣的用類作為參數(shù)的方法,因此,需要通過泛型獲取到具體類的名字并使用第二種方法構(gòu)造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} } }
使用方法同上,直接加一個(gè)@Slf4j即可使用。
5 完整Demo參考
6 參考
2、Kotlin官網(wǎng)-內(nèi)聯(lián)函數(shù)
到此這篇關(guān)于Kotlin中日志使用方法的文章就介紹到這了,更多相關(guān)Kotlin日志使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android垃圾回收機(jī)制及程序優(yōu)化System.gc
這篇文章主要介紹了Android垃圾回收機(jī)制及程序優(yōu)化System.gc的相關(guān)資料,需要的朋友可以參考下2016-01-01Android自定義TextBanner實(shí)現(xiàn)自動(dòng)滾動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android自定義TextBanner實(shí)現(xiàn)自動(dòng)滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07解決java.lang.NoClassDefFoundError: android.support.v4.animati
這篇文章主要介紹了解決Android Studio出現(xiàn)java.lang.NoClassDefFoundError: android.support.v4.animation.AnimatorCompatHelper的問題,感興趣的朋友一起看看吧2021-08-08Android實(shí)現(xiàn)自動(dòng)變換大小的ViewPager
ViewPager使用適配器類將數(shù)據(jù)和view的處理分離,ViewPager的適配器叫PagerAdapter,這是一個(gè)抽象類,不能實(shí)例化,所以它有兩個(gè)子類:FragmentPagerAdapter 和 FragmentStatePagerAdapter,這兩個(gè)都是處理頁面為Fragment的情況2022-11-11Android ListView實(shí)現(xiàn)單選及多選等功能示例
這篇文章主要介紹了Android ListView實(shí)現(xiàn)單選及多選等功能的方法,結(jié)合實(shí)例形式分析了ListView單選、多選及長(zhǎng)按多選等功能相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08Android進(jìn)度條ProgressBar的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android進(jìn)度條ProgressBar的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09Android 網(wǎng)絡(luò)圖片查看器與網(wǎng)頁源碼查看器
本篇文章主要介紹了Android 網(wǎng)絡(luò)圖片查看器與網(wǎng)頁源碼查看器的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04