Ktor 伺服器中的日誌記錄
程式碼範例: logging
Ktor 根據所使用的平台提供不同的方式來記錄您的應用程式:
- 在 JVM 上,Ktor 使用 SLF4J API 作為各種日誌框架(例如 Logback 或 Log4j)的門面,並允許您記錄應用程式事件。 要啟用日誌記錄,您需要為所需的框架新增 相依性 並提供該框架特定的 配置。
您也可以安裝並配置 CallLogging 外掛程式來記錄用戶端請求。
- 對於 原生伺服器,Ktor 提供了一個將所有內容列印到標準輸出的記錄器。
JVM
新增記錄器相依性
要啟用日誌記錄,您需要包含所需日誌框架的構件。 例如,Logback 需要以下相依性:
要使用 Log4j,您需要新增 org.apache.logging.log4j:log4j-core 和 org.apache.logging.log4j:log4j-slf4j-impl 構件。
配置記錄器
要了解如何配置所選的日誌框架,請參閱其文件,例如:
例如,要配置 Logback,您需要將 logback.xml 檔案放在類別路徑的根目錄中(例如 src/main/resources)。 下方的範例顯示了一個使用 STDOUT appender 的 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 appender。
<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
要為原生伺服器配置日誌層級,請在 執行 應用程式時將以下值之一指派給 KTOR_LOG_LEVEL 環境變數:
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
例如,TRACE 層級會啟用 路由追蹤,這有助於您確定某些路由未被執行的原因。
在程式碼中存取記錄器
Logger 執行個體由一個實作 Logger 介面的類別來表示。您可以使用 Application.log 屬性在 Application 內部存取 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}")
}
}