Skip to content

Ktor 服务器中的日志

代码示例: logging

Ktor 根据所使用的平台,提供不同的应用程序日志记录方式:

  • 在 JVM 上,Ktor 使用 SLF4J API 作为各种日志框架(例如 LogbackLog4j)的门面,并允许您记录应用程序事件。要启用日志记录,您需要为所需框架添加依赖项,并提供该框架特有的配置

    您还可以安装并配置 CallLogging 插件以记录客户端请求。

  • 对于原生服务器,Ktor 提供了一个记录器,它将所有内容打印到标准输出。

JVM

添加记录器依赖项

要启用日志记录,您需要包含所需日志框架的 artifact。 例如,Logback 需要以下依赖项:

Kotlin
Groovy
XML

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

配置记录器

要了解如何配置选定的日志框架,请参见其文档,例如:

例如,要配置 Logback,您需要将 logback.xml 文件放到类路径的根目录(例如,在 src/main/resources 中)。 以下示例展示了带 STDOUT 追加器的 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 追加器。

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

要配置原生服务器的日志级别, 请在运行应用程序时将以下值之一分配给 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}")
    }
}