Ktorサーバーでのロギング
コード例: logging
Ktorは、使用するプラットフォームに応じて、アプリケーションのログ記録にさまざまな方法を提供します。
- JVMでは、KtorはSLF4J APIをさまざまなロギングフレームワーク(例えばLogbackやLog4j)のファサードとして使用し、アプリケーションイベントのログ記録を可能にします。ロギングを有効にするには、目的のフレームワークの依存関係を追加し、そのフレームワークに固有の設定を提供する必要があります。
クライアントリクエストをログに記録するために、CallLoggingプラグインをインストールして設定することもできます。
- Nativeサーバーの場合、Ktorはすべてを標準出力に出力するロガーを提供します。
JVM
ロガーの依存関係を追加する
ロギングを有効にするには、目的のロギングフレームワークのアーティファクトを含める必要があります。 例えば、Logbackには以下の依存関係が必要です。
Log4jを使用するには、org.apache.logging.log4j:log4j-core
とorg.apache.logging.log4j:log4j-slf4j-impl
のアーティファクトを追加する必要があります。
ロガーを設定する
選択したロギングフレームワークの設定方法については、そのドキュメントを参照してください。例えば、以下の通りです。
例えば、Logbackを設定するには、logback.xml
ファイルをクラスパスのルート(例えばsrc/main/resources
)に配置する必要があります。 以下の例は、ログをコンソールに出力するSTDOUT
アペンダーを使用したサンプルのLogback設定を示しています。
<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
アペンダーを使用できます。
<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インスタンスにアクセスできます。例えば、以下のコードスニペットは、モジュール内でログにメッセージを追加する方法を示しています。
import io.ktor.server.application.*
fun Application.module() {
log.info("Hello from module!")
}
call.application.environment.log
プロパティを使用してApplicationCallからLoggerにアクセスすることもできます。
routing {
get("/api/v1") {
call.application.environment.log.info("Hello from /api/v1!")
}
}
プラグインとファイルでのロギング
プラグインやファイル内でアプリケーションログを使用することは推奨されません。各プラグインまたはファイルごとに別個のロガーを使用する方が良いでしょう。これを行うには、任意のロギングライブラリを使用できます。
マルチプラットフォームプロジェクトの場合、KtorSimpleLoggerクラスを使用できます。
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}")
}
}