Skip to content

Ktor 伺服器中的日誌記錄

程式碼範例: logging

Ktor 根據所使用的平台,提供不同的方式來記錄您的應用程式:

  • 在 JVM 上,Ktor 使用 SLF4J API 作為各種日誌框架(例如 LogbackLog4j)的門面,讓您能夠記錄應用程式事件。若要啟用日誌記錄,您需要為所需的框架添加依賴項並提供該框架專屬的配置

    您也可以安裝並配置 CallLogging 插件來記錄客戶端請求。

  • 對於 Native 伺服器,Ktor 提供一個日誌記錄器,會將所有內容列印到標準輸出。

JVM

添加日誌記錄器依賴項

若要啟用日誌記錄,您需要包含所需日誌框架的構件 (artifacts)。 例如,Logback 需要以下依賴項:

Kotlin
Groovy
XML

若要使用 Log4j,您需要添加 org.apache.logging.log4j:log4j-coreorg.apache.logging.log4j:log4j-slf4j-impl 構件。

配置日誌記錄器

若要了解如何配置所選的日誌框架,請參閱其文件,例如:

例如,若要配置 Logback,您需要將 logback.xml 檔案放置在類路徑的根目錄下(例如,在 src/main/resources 中)。 下方的範例顯示一個帶有 STDOUT appender 的 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 appender。

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.log 屬性在 Application 內部訪問 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}")
    }
}