介绍
Fastify 是一个快速而低开销的 web 框架,适用于构建高效的 web 应用程序。它旨在为 Node.js 应用带来大幅度的提升,包括已知的安全问题和性能相关问题。其中请求日志记录是其中重要的环节之一,它可以帮助我们更准确地追踪请求和错误原因,定位根本问题,并为以后的维护和优化提供帮助。
本文主要介绍 Fastify 中的请求日志记录,包括 Fastify 自带的默认日志记录器,自定义日志记录器等。
Fastify 自带默认日志记录器
Fastify 中有一个默认的日志记录器(fastify.logger()
),它预先设置了一组格式和语义,用于记录请求、服务器错误和日志级别等信息。默认的记录格式如下:
{"level":30,"time":1569327599781,"pid":15395,"hostname":"localhost","reqId":1,"res":{"statusCode":404},"responseTime":4,"msg":"{\"req\":{\"method\":\"GET\",\"url\":\"/users\",\"hostname\":\"localhost:3000\",\"remoteAddress\":\"::1\",\"remotePort\":49858},\"level\":30,\"time\":1569327599781,\"msg\":\"request completed\",\"res\":{\"statusCode\":404},\"responseTime\":4}"}
其中,各字段含义如下:
level
:日志级别,范围为10
至60
,默认为30
。time
:时间戳,表示记录事件的时间戳,使用Date.getTime()
格式。pid
:当前进程的 ID。hostname
:主机名,默认从require('os').hostname()
获得。reqId
:请求 ID,唯一地标识一个请求。res
:在请求完成后,响应对象的状态信息。responseTime
:处理请求所花费的时间,单位为毫秒。msg
:包含所有信息的 JSON 字符串。
默认日志级别为 30
,它表示 “信息”。如果以比 30
更低的级别呈现日志消息,将不会被记录。如果以比 30
更高的级别呈现日志消息,它将被记录在对应的日志级别下。
对于需要自定义级别和格式的,可以使用以下方式:
const fastify = require('fastify')({ logger: { level: 'trace', prettyPrint: true } })
在此代码中,我们创建了一个 Fastify 实例,并定义了一个名为 logger
的配置项。console
条目将使用 prettyPrint
的选项来记录到控制台中。在这个例子中,日志级别为 trace
,因此它将记录 error
、warn
、info
、debug
和 trace
级别的所有消息。
自定义日志记录器
如果需要自定义日志记录器,则可以使用 Fastify 提供的 pino
模块。pino
是一个快速的、无依赖的日志系统,其能够被任何 JavaScript 应用程序集成。
在 Fastify 中使用 pino
记录器直接是一种可行的方法,因为 fastify.logger()
背后的日志记录器正是使用 pino
来进行请求记录。在此,我们将使用 pino
来创建一个新的日志记录器,并将其与 Fastify 的实例进行集成。下面是示例代码:
const fastify = require('fastify')({ logger: require('pino')({ level: 'info', base: { pid: process.pid } }) })
在这个例子中,我们创建了一个 Fastify 实例,并使用 pino
模块创建了一个新的日志记录器,然后将其传递给了 Fastify 实例。level
配置选项将日志级别设置为 info
,而 base
则是一个可选对象,用于添加对于所有日志消息通用的元数据。在这个例子中,我们向 base
配置选项中添加了一个进程 ID(pid
)。
接下来,使用 fastify.log.info()
或者 fastify.log.error()
等方法,就可以像使用默认日志记录器一样使用自定义记录器了。
fastify.get('/', function (request, reply) { fastify.log.info('Request to index') reply.send({ hello: 'world' }) })
上面的例子中,我们添加了 fastify.log.info()
方法,用于记录请求到 /
的信息。可以根据需要添加更多的消息种类。此外,在没有设置 reqId
的情况下,pino
将为每个记录分配一个 UUID。
结论
日志记录是 web 应用程序的必要组成部分,可以验证代码、调试错误和跟踪应用程序性能。在 Fastify 中,我们可以使用默认的日志记录器来记录请求,也可以通过使用自定义日志记录器来更好地满足我们自身的需求。
最后,在进行日志记录时,必须了解日志级别和角色,并且能够在日志记录中准确、一致地使用不同的事件类型和标签。这样可以最大程度地提高日志的可靠性和实用性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/677646596d66e0f9aa1c1532