Skip to content

Ktorサーバーでのロギング

コード例: logging

Ktorは、使用するプラットフォームに応じて、アプリケーションのログ記録にさまざまな方法を提供します。

  • JVMでは、KtorはSLF4J APIをさまざまなロギングフレームワーク(例えばLogbackLog4j)のファサードとして使用し、アプリケーションイベントのログ記録を可能にします。ロギングを有効にするには、目的のフレームワークの依存関係を追加し、そのフレームワークに固有の設定を提供する必要があります。

    クライアントリクエストをログに記録するために、CallLoggingプラグインをインストールして設定することもできます。

  • Nativeサーバーの場合、Ktorはすべてを標準出力に出力するロガーを提供します。

JVM

ロガーの依存関係を追加する

ロギングを有効にするには、目的のロギングフレームワークのアーティファクトを含める必要があります。 例えば、Logbackには以下の依存関係が必要です。

Kotlin
Groovy
XML

Log4jを使用するには、org.apache.logging.log4j:log4j-coreorg.apache.logging.log4j:log4j-slf4j-implのアーティファクトを追加する必要があります。

ロガーを設定する

選択したロギングフレームワークの設定方法については、そのドキュメントを参照してください。例えば、以下の通りです。

例えば、Logbackを設定するには、logback.xmlファイルをクラスパスのルート(例えばsrc/main/resources)に配置する必要があります。 以下の例は、ログをコンソールに出力するSTDOUTアペンダーを使用したサンプルのLogback設定を示しています。

xml
<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="trace">
        <appender-ref ref="STDOUT"/>
    </root>
    <logger name="io.netty" level="INFO"/>
</configuration>

ログをファイルに出力したい場合は、FILEアペンダーを使用できます。

xml
<configuration>
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>testFile.log</file>
        <append>true</append>
        <encoder>
            <pattern>%d{YYYY-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="trace">
        <appender-ref ref="FILE"/>
    </root>
    <logger name="io.netty" level="INFO"/>
</configuration>

完全な例はこちらで確認できます: logging

Native

Nativeサーバーのロギングレベルを設定するには、アプリケーションの実行時KTOR_LOG_LEVEL環境変数に以下のいずれかの値を割り当てます。

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR

例えば、_TRACE_レベルではルートトレースが有効になり、特定のルートが実行されない理由を判断するのに役立ちます。

コード内のロガーにアクセスする

Loggerインスタンスは、Loggerインターフェースを実装するクラスによって表現されます。Application内でApplication.logプロパティを使用してLoggerインスタンスにアクセスできます。例えば、以下のコードスニペットは、モジュール内でログにメッセージを追加する方法を示しています。

kotlin
import io.ktor.server.application.*

fun Application.module() {
    log.info("Hello from module!")
}

call.application.environment.logプロパティを使用してApplicationCallからLoggerにアクセスすることもできます。

kotlin
routing {
    get("/api/v1") {
        call.application.environment.log.info("Hello from /api/v1!")
    }
}

プラグインとファイルでのロギング

プラグインやファイル内でアプリケーションログを使用することは推奨されません。各プラグインまたはファイルごとに別個のロガーを使用する方が良いでしょう。これを行うには、任意のロギングライブラリを使用できます。

マルチプラットフォームプロジェクトの場合、KtorSimpleLoggerクラスを使用できます。

kotlin
package com.example

import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.util.logging.*

internal val LOGGER = KtorSimpleLogger("com.example.RequestTracePlugin")

val RequestTracePlugin = createRouteScopedPlugin("RequestTracePlugin", { }) {
    onCall { call ->
        LOGGER.trace("Processing call: ${call.request.uri}")
    }
}