1. 序章

ロギングは、本番環境に対応したアプリケーションの重要な部分です。 Javaアプリケーションで人気のある選択肢は、 slf4j です。これは、logbacklog4jなどのロギングフレームワークのシンプルなファサードです。 それは素晴らしいことですが、Kotlinが提供するすべての優れた機能を使用しているわけではありません。

この記事では、 a Kotlin sfl4jラッパー、単にkotlin-loggingという名前を付けます。

2. クイックスタート

詳細に入る前に、ここに簡単な使用ガイドがあります。

2.1. プロジェクトへの追加

プロジェクトにkotlin-loggingを追加するには、次のいずれかのMavenを使用できます。

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

またはGradle:

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

kotlin-loggingはslf4jのラッパーであり、slf4j自体はさまざまなロギングバックエンドのラッパーであるため、構成が必要になります。 この例では、ログバックを使用し、次のいずれかのMavenを使用してログバックを追加します。

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.6</version>
</dependency>

またはGradle:

implementation group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.6'

ログバックを使用するには、なんらかの構成が必要です。 基本的なものは次のとおりです。

src/main/resources/logback.xml
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} MDC=%X{user} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="debug">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

ログバック構成にはその他ありますが、基本的な使用法にはそれで十分です。 これですべてのセットアップが完了しました。どのように実際に何かをログに記録できるかを見てみましょう。

2.2. 基本的な使用法

ロガーの使用を開始するには、まず、kotlin-loggingをインポートする必要があります。

import mu.KotlinLogging

次に、loggerを最上位変数として宣言します。

private val logger = KotlinLogging.logger {}

それが済んだら、準備は完了です。 たとえば、次のように実行します。

fun main() {
    logger.trace { "This is trace log" }
    logger.debug { "This is debug log" }
    logger.info { "This is info log" }
    logger.warn { "This is warn log" }
    logger.error { "This is error log" }
}

印刷します:

16:29:20.390 [main] DEBUG com.baeldung.logging.BasicUsageMain MDC= - This is debug log
16:29:20.393 [main] INFO  com.baeldung.logging.BasicUsageMain MDC= - This is info log
16:29:20.394 [main] WARN  com.baeldung.logging.BasicUsageMain MDC= - This is warn log
16:29:20.394 [main] ERROR com.baeldung.logging.BasicUsageMain MDC= - This is error log

そして、それはクイックスタートガイドのために行う必要があります。 いくつかの未回答の質問がありますが、 trace ログが印刷されなかったのはなぜですか? 括弧の代わりに中括弧を使用するのはなぜですか? 次のセクションでそれらの質問(およびそれ以上!)に答えましょう。

3. 詳細

kotlin-loggingライブラリの基本的な使用法は簡単ですが、詳細のいくつかの知識は、より高度な使用法に役立つ可能性があります。

3.1. ブレース自分自身

kotlin-loggingを使用してログを記録するときに、括弧の代わりに中括弧を使用すると非常に便利です。 大きな評価関数があるとしましょう。

val bigEvaluationFunction: (String) -> String = {
    println("I am a VERY BIG evaluation: $it")
    "Big Evaluation"
}

そして、最初に括弧を使用した2つのロガー呼び出し:

logger.trace("Running big evaluation: ${bigEvaluationFunction("eagerly")}")

次に、中括弧を使用します。

logger.trace { "Running big evaluation: ${bigEvaluationFunction("lazily")}" }

logback.xmltrace より上のログレベルが構成されていると仮定すると(たとえば、 debug )、これらのログはどちらも何もしません。 ? 違う! 何もログに記録されませんが、括弧を使用した trace呼び出しは熱心に評価されるため、このコードの出力は次のようになります。

I am a VERY BIG evaluation: eagerly

要約すると、ログを毎回評価する場合は括弧を使用し、必要な場合にのみログを評価する場合は中括弧を使用します

3.2. ロガーの命名

元の例でわかるように、ロガーを作成するたびに名前を付ける必要はありません。 Kotlin-loggingは私たちのためにそれを行うので、このコードは次のとおりです。

val logger = KotlinLogging.logger {}

次のようなコードに変換されます:

val logger = LoggerFactory.getLogger("package.ClassName")

通常はそれで十分ですが、ロガーに非常に特別な名前を付けたい場合は、kotlin-loggingで次のようにできます。

private val logger = KotlinLogging.logger("The Name")

3.3. 基礎となるロガーの使用

Kotlin-loggingはslf4jラッパーであり、直接アクセスしたい場合があります。 もちろん、Kotlin-loggingを使用すると、次のことが可能になります。

val slf4j: org.slf4j.Logger = logger.underlyingLogger

ここから、 slf4jloggerで実行できるすべてのことを実行できます。

3.4. ロガーを作成するさまざまな方法

現在、kotlin-loggingでロガーを作成するための推奨される方法は、最上位の宣言メソッドです。

private val staticLogger = KotlinLogging.logger {}

それを作成する方法は他にもあります(あまり推奨されません)。 以前に推奨されたメソッドの1つは、問題のクラスのコンパニオンオブジェクトを作成し、それを KLogging()で拡張することです。

class ClassForImportantWork {
    companion object: KLogging()

    fun importantWork() {
        logger.debug { "I'm logging via companion object" }
    }
}

便利なもう1つの方法は、 KLoggable インターフェイスを拡張し、クラスのフィールドとしてロガーを宣言することです。

class ClassForImportantWork: KLoggable {
    override val logger: KLogger = logger()

    fun importantWork() {
        logger.debug { "I'm logging via non static member" }
    }
}

より多くのユースケースにはトップレベルの宣言メソッドで十分ですが、古いコードに遭遇した場合は、以前のメソッドも知っておくと役立つ場合があります。

3.5. Kotlinの使用-Androidでのロギング

Androidアプリケーションでkotlin-loggingを使用できます。 slf4j-android を追加するだけです:

implementation group: 'org.slf4j', name: 'slf4j-android', version: '1.7.32'

その依存関係を追加した後、前の例で示したようにkotlin-loggingを使用できます。

3.6. Kotlin-ロギングとMDC

MDC は、アプリケーションロギングの改善に重要な役割を果たしますが、ここでの問題は、kotlin-loggingがそれをサポートしているかどうかです。 もちろん、答えはそうです。 フラグメントに注意してください MDC = %X {user} オリジナルで logback.xml。 

withLoggingContext を使用すると、userパラメーターにデータを入力できます。 したがって、このコード:

withLoggingContext("user" to "Baeldung") {
    logger.info { "Log with MDC" }
}

生成されます:

16:34:36.486 [main] INFO  com.baeldung.logging.LoggingContext MDC=Baeldung - Log with MDC

ロギングコンテキストで提供したユーザーは、ロガーに自動的に渡されます。

4. 結論

Kotlin-loggingは、ロギングコードをKotlinのように感じさせ、Javaのように感じさせないようにするための便利なツールです。 このライブラリの構成と使用方法、およびこのライブラリの使用経験に影響を与える可能性のあるさまざまな詳細について学習しました。

いつものように、この記事のコードはGitHubから入手できます。