Ktorにおけるロギング

Estimated reading time: 1 minute

KtorはSLF4Jをロギングに利用しています。

SLF4Jプロバイダー

ロギングプロバイダーを追加しない場合、アプリケーション起動時に以下のようなメッセージが出ます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これらのwarningメッセージを取り除き、また何がアプリケーションで起きているかをより理解するため、 プロバイダーを追加することでロギングのセットアップをすることができます。

プロバイダーはJavaのServiceLoaderメカニズムを使っています。 そのためコード内で何かしらをすることなしに、自動で発見され追加されます。

Logbackプロバイダー

SLF4Jプロバイダーとして、log4jの後継であるlogbackを使うことができます。

Gradleのbuild.gradleまたはbuild.gradle.ktsは以下のようになります:

compile("ch.qos.logback:logback-classic:1.2.3")

Mavensのpom.xml:

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

追加し、アプリケーションを起動すると、IntelliJ IDEAのRunページにてロギングメッセージを見ることができることができます。 しかし、これらのロギングメッセージはさらに有益にする余地が残っています。

Logbackプロバイダーの設定

デフォルトのロギングで十分ではない場合、logback.xmllogback-test.xml(プライオリティはこちらのほうが高いです)ファイルを src/main/resourcesフォルダに置き、ロギングの調整を行うことができます。 例えば:

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="org.eclipse.jetty" level="INFO"/>
    <logger name="io.netty" level="INFO"/>
</configuration>

これを追加した後に、アプリケーションを停止し再度起動しブラウザでlocalhost:8080を見ると、 IDEAのrunページで以下のようなログメッセージを見ることができるはずです:

2017-05-29 23:08:12.926 [nettyCallPool-4-1] TRACE ktor.application - 200 OK: GET - /

リクエストのログを出力するにはCall Logging Featureをインストールすればよいです。

どのようにlogback.xmlファイルを変更しログ出力形式を変更すればよいかを理解するには、logbackマニュアルを見てください。

メインロガーへのアクセス

ApplicationEnvironmentインターフェースはlogプロパティを持っています。 ApplicationCallにおいてcall.application.environment.logを使ってアクセスすることができます。