主题
内建日志系统(Pino)
Fastify 默认集成了 Pino,一个高性能的 JSON 格式日志库。Pino 被设计为具有极低的性能开销,特别适用于高并发的应用场景,能够快速记录和输出日志数据。其高效的性能和灵活的日志配置,使得 Pino 成为 Fastify 的理想选择。
1. Pino 的优势
Pino 的设计目标是提供一个快速、低开销且功能强大的日志解决方案。其优势包括:
- 高性能:Pino 在设计上极其注重性能,它能够以非常高的速度输出日志,并且在高并发场景下也能保持良好的性能。
- JSON 格式:Pino 使用 JSON 格式输出日志,这使得日志数据易于结构化处理,便于后期分析、存储和处理。
- 异步记录:Pino 支持异步日志记录,避免了日志记录对应用性能的阻塞影响。
- 灵活配置:Pino 提供丰富的配置选项,可以灵活定制日志级别、输出格式、日志传输等。
2. Fastify 中的 Pino 配置
Fastify 默认启用了 Pino 作为日志系统,可以通过 Fastify 实例的 logger
选项进行配置。
默认配置
Fastify 会在启动时自动创建一个默认的 Pino 实例,记录如下信息:
- 请求的基本信息(如方法、路径、响应状态码)
- 请求处理的时间(响应时间)
- 错误信息(如有)
例如,Fastify 启动后会自动输出请求日志:
txt
{"level":30,"time":1630367982965,"pid":12345,"hostname":"localhost","reqId":1,"req":{"method":"GET","url":"/","headers":{"accept":"application/json"}},"res":{"statusCode":200},"responseTime":4}
自定义配置
可以通过 logger
配置项来定制 Pino 的行为。例如,改变日志级别、格式、输出位置等:
js
const fastify = require('fastify')({
logger: {
level: 'info', // 设置日志级别为 'info'
prettyPrint: true, // 美化输出格式
redact: ['req.headers.authorization'], // 对敏感数据进行脱敏处理
base: { pid: false }, // 关闭 pid 信息
}
})
fastify.get('/', async (request, reply) => {
request.log.info('Handling / request')
return { hello: 'world' }
})
fastify.listen(3000, err => {
if (err) {
fastify.log.error(err)
process.exit(1)
}
fastify.log.info('Server started')
})
在上面的示例中,logger
配置了日志级别、格式化输出、脱敏处理等选项,确保日志符合特定需求。
3. Pino 日志级别
Pino 支持以下几种日志级别,用于控制日志输出的详细程度:
- fatal:表示非常严重的错误,导致应用无法继续运行。
- error:表示常规的错误。
- warn:表示警告信息,可能预示着潜在的问题。
- info:表示常规的操作信息,通常用于跟踪程序的执行流程。
- debug:用于调试信息,包含详细的诊断数据。
- trace:最详细的日志级别,用于详细追踪每个操作。
可以通过 logger.level
配置来设置日志级别,默认级别为 info
。
4. 使用日志对象
Fastify 的请求和响应对象都可以通过 .log
属性访问到日志实例。这意味着你可以在路由处理函数中方便地记录日志信息:
js
fastify.get('/', async (request, reply) => {
request.log.info('Handling / request')
reply.log.debug('Response will be sent soon')
return { hello: 'world' }
})
在这个示例中,我们使用 request.log
和 reply.log
来记录信息和调试日志。
5. Pino 日志格式化
Pino 的输出默认是 JSON 格式,但可以通过 prettyPrint
配置项使其输出为易读的格式。prettyPrint
配置会在开发环境中启用更加友好的格式化输出,适合开发人员查看。
开发环境中的格式化输出
js
const fastify = require('fastify')({
logger: {
level: 'info',
prettyPrint: { colorize: true } // 启用彩色输出
}
})
这将启用彩色的、易读的日志输出,适合开发时使用。
生产环境中的日志
在生产环境中,通常希望日志以 JSON 格式输出,以便进行集中式日志管理和分析。可以通过禁用 prettyPrint
配置,并确保日志输出到文件或日志聚合服务。
6. 集成日志存储与聚合
在大规模生产环境中,日志通常会被集中存储并进行分析。Pino 可以轻松集成到日志聚合服务(如 Elasticsearch、Loggly、Datadog 等)中。通过配置 pino-http
插件,Fastify 可以将日志发送到这些服务,进行实时监控和日志分析。
总结
Fastify 的内建日志系统 Pino 通过其高性能、低开销的设计,为开发者提供了一个强大且灵活的日志记录工具。无论是在开发环境中进行调试,还是在生产环境中进行日志存储和分析,Pino 都能满足高效、可定制的日志需求。