Ktor 伺服器中的日誌記錄
程式碼範例: logging
Ktor 根據所使用的平台,提供不同的方式來記錄您的應用程式:
- 在 JVM 上,Ktor 使用 SLF4J API 作為各種日誌框架(例如 Logback 或 Log4j)的門面,讓您能夠記錄應用程式事件。若要啟用日誌記錄,您需要為所需的框架添加依賴項並提供該框架專屬的配置。
您也可以安裝並配置 CallLogging 插件來記錄客戶端請求。
- 對於 Native 伺服器,Ktor 提供一個日誌記錄器,會將所有內容列印到標準輸出。
JVM
添加日誌記錄器依賴項
若要啟用日誌記錄,您需要包含所需日誌框架的構件 (artifacts)。 例如,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
若要配置 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}")
}
}