Logging¶
Vapor 的 Logging
API 是基于 Apple 的 SwiftLog 而构建。意味着 Vapor 兼容所有基于 SwiftLog
实现的后端框架。
Logger¶
Logger
的实例用于输出日志消息,Vapor 提供了一些便捷的方法使用日志记录器。
Request¶
每个传入 Request
都有一个单独的日志记录器,你可以在该请求中使用任何类型日志。
app.get("hello") { req -> String in
req.logger.info("Hello, logs!")
return "Hello, world!"
}
请求的日志记录器都有一个单独的UUID
用于标识该请求,便于追踪该日志。
[ INFO ] Hello, logs! [request-id: C637065A-8CB0-4502-91DC-9B8615C5D315] (App/routes.swift:10)
信息
日志记录器的元数据仅在调试日志级别或者更低级别显示。
应用¶
关于应用程序启动和配置过程中的日志消息,可以使用 Application
的日志记录器:
app.logger.info("Setting up migrations...")
app.migrations.use(...)
自定义日志记录器¶
在无法访问 Application
或者 Request
情况下,你可以初始化一个新的 Logger
。
let logger = Logger(label: "dev.logger.my")
logger.info(...)
尽管自定义的日志记录器仍将输出你配置的后端日志记录,但是他们没有附带重要的元数据,比如 request
的 UUID
。所以尽量使用 application
或者 request
的日志记录器。
日志级别(Level)¶
SwiftLog
支持多种日志级别。
名称 | 说明 |
---|---|
trace | 用户级基本输出信息 |
debug | 用户级调试信息 |
info | 用户级重要信息 |
notice | 表明会出现非错误的情形,需要关注处理 |
warning | 表明会出现潜在错误的情形,比 notice 的消息严重 |
error | 指出发生错误事件,但不影响系统的继续运行 |
critical | 系统级危险,需要立即关注错误信息并处理 |
出现 critical
消息时,日志框架可以自由的执行权限更重的操作来捕获系统状态(比如捕获跟踪堆栈)以方便调试。
默认情况下,Vapor 使用 info
级别日志。当运行在 production
环境时,将使用 notice
提高性能。
修改日志级别¶
不管环境模式如何,你都可以通过修改日志级别来增加或减少生成的日志数量。
第一种方法,在启动应用程序时传递可选参数 --log
标志:
swift run App serve --log debug
第二种方法,通过设置 LOG_LEVEL
环境变量:
export LOG_LEVEL=debug
swift run App serve
这两种方法可以在 Xcode 中编辑 App
(scheme)模式进行修改。
配置¶
SwiftLog 可以通过每次进程启动 LoggingSystem
时进行配置。Vapor 项目通常在 entrypoint.swift
执行操作。
var env = try Environment.detect()
try LoggingSystem.bootstrap(from: &env)
bootstrap(from:)
是 Vapor 提供的调用方法,它将基于命令行参数和环境变量来配置默认日志处理操作。默认的日志处理操作支持使用 ANSI 颜色将消息输出到终端。
自定义操作¶
你可以覆盖 Vapor 的默认日志处理并注册自己的日志处理操作。
import Logging
LoggingSystem.bootstrap { label in
StreamLogHandler.standardOutput(label: label)
}
所有 SwiftLog 支持的后端框架均可与 Vapor 一起工作。但是,使用命令行参数和环境变量更改日志级别只支持 Vapor 的默认日志处理操作。