Back to Vapor

Logging

docs/basics/logging.zh.md

latest3.6 KB
Original Source

Logging

Vapor 的 Logging API 是基于 Apple 的 SwiftLog 而构建。意味着 Vapor 兼容所有基于 SwiftLog 实现的后端框架

Logger

Logger 的实例用于输出日志消息,Vapor 提供了一些便捷的方法使用日志记录器。

Request

每个传入 Request 都有一个单独的日志记录器,你可以在该请求中使用任何类型日志。

swift
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)

!!! info "信息" 日志记录器的元数据仅在调试日志级别或者更低级别显示。

应用

关于应用程序启动和配置过程中的日志消息,可以使用 Application 的日志记录器:

swift
app.logger.info("Setting up migrations...")
app.migrations.use(...)

自定义日志记录器

在无法访问 Application 或者 Request 情况下,你可以初始化一个新的 Logger

swift
let logger = Logger(label: "dev.logger.my")
logger.info(...)

尽管自定义的日志记录器仍将输出你配置的后端日志记录,但是他们没有附带重要的元数据,比如 requestUUID。所以尽量使用 application 或者 request 的日志记录器。

日志级别(Level)

SwiftLog 支持多种日志级别。

<!-- ~~SwiftLog supports several different logging levels.~~ -->
名称说明
trace用户级基本输出信息
debug用户级调试信息
info用户级重要信息
notice表明会出现非错误的情形,需要关注处理
warning表明会出现潜在错误的情形,比 notice 的消息严重
error指出发生错误事件,但不影响系统的继续运行
critical系统级危险,需要立即关注错误信息并处理

出现 critical 消息时,日志框架可以自由的执行权限更重的操作来捕获系统状态(比如捕获跟踪堆栈)以方便调试。

默认情况下,Vapor 使用 info 级别日志。当运行在 production 环境时,将使用 notice 提高性能。

修改日志级别

不管环境模式如何,你都可以通过修改日志级别来增加或减少生成的日志数量。

第一种方法,在启动应用程序时传递可选参数 --log 标志:

sh
swift run App serve --log debug

第二种方法,通过设置 LOG_LEVEL 环境变量:

sh
export LOG_LEVEL=debug
swift run App serve

这两种方法可以在 Xcode 中编辑 App(scheme)模式进行修改。

配置

SwiftLog 可以通过每次进程启动 LoggingSystem 时进行配置。Vapor 项目通常在 entrypoint.swift 执行操作。

swift
var env = try Environment.detect()
try LoggingSystem.bootstrap(from: &env)

bootstrap(from:) 是 Vapor 提供的调用方法,它将基于命令行参数和环境变量来配置默认日志处理操作。默认的日志处理操作支持使用 ANSI 颜色将消息输出到终端。

自定义操作

你可以覆盖 Vapor 的默认日志处理并注册自己的日志处理操作。

swift
import Logging

LoggingSystem.bootstrap { label in
    StreamLogHandler.standardOutput(label: label)
}

所有 SwiftLog 支持的后端框架均可与 Vapor 一起工作。但是,使用命令行参数和环境变量更改日志级别只支持 Vapor 的默认日志处理操作。