在开发 Web 应用程序时,日志输出对于监控和调试非常关键。在 Node.js 中,一个高性能的 Web 框架 Fastify 提供了强大的日志输出功能。然而,Fastify 日志输出的默认行为可能并不满足所有需求,因此,我们需要一些技巧来优化它。
Fastify 日志输出的默认行为
Fastify 默认使用 pino 作为日志输出工具,如果你没有指定 log 输出器,则它会将日志输出到控制台。以下是 Fastify 默认日志输出的一个示例:
-- -------------------- ---- ------- -------------------------- ---- ------ -- ----------- -------- ------- --- ------------ -------- ----- -------------- ----------- ----------- -------- -- ----- ------ ---- -------- -------------- ------------ ------- --------------------------------------------------------------- ---------------- -------------- ---------------- ----- ------- ----------- ---------- ------- -------------------------------- -------------------------------- --------------------------
它显示了每次请求的时间戳、级别(INFO)、进程 ID、主机名、日志消息等信息。
添加自定义信息
Fastify 默认的日志输出已经很详细了,但是,在一些情况下我们可能需要添加一些自定义信息,例如请求的响应时间、请求的来源 IP 等信息。
我们可以使用 Fastify 的装饰器模式来添加自定义信息。以下代码演示了如何添加响应时间信息:
-- -------------------- ---- ------- ----- ------- - -------------------- ----- ----- - ---------- --------------------------- ----- ---- -- - ----- --- - ---------- ----- -------- - --- - ----- --------------------- -------- - -------- -- --------------- -------- -- -------------------- --- -- - -- ----- - ------------------ --------------- - --
在这个例子中,我们在请求处理函数中添加了一个名为 duration 的自定义字段,它表示请求处理的时间。然后,我们将这个信息传递给 req.log.info 方法,它会将这个信息添加到日志中。
输出 JSON 格式日志
默认的日志输出格式是可读性较好的文本格式。但是,在一些情况下,我们可能需要将日志输出为 JSON 格式以便更好的与其他系统集成。
我们可以通过设置输出格式来达到这个目的。以下代码演示了如何将日志输出为 JSON 格式:
-- -------------------- ---- ------- ----- ------- - -------------------- ----------------------------------------- - ------------ ------ ------- --------------- ----------------- -------------------- ----------------- -- --------------------------- ----- ---- -- - --------------------- -------- --------------- -------- -- -------------------- --- -- - -- ----- - ------------------ --------------- - --
在这个例子中,我们通过注册 fastify-pino 插件并设置 prettyPrint 选项为 false 来将日志输出为 JSON 格式。我们还设置了 redact 选项,它用于隐藏一些敏感信息,例如请求头、连接信息、来源 IP 等信息。
输出的日志将会像这样:
{"level":30,"time":1631516472386,"msg":"request served","pid":9369,"hostname":"localhost","reqId":1}
将日志输出到文件
默认情况下,Fastify 将日志输出到控制台,但是在一些情况下,我们可能需要将日志输出到文件中,例如,我们可能需要将日志集中储存以便于日志分析和监控。
我们可以使用 pino 库来将日志输出到文件中。以下代码演示了如何将日志输出到文件中:
-- -------------------- ---- ------- ----- ------- - -------------------- ----- -- - ------------- ----- ---- - --------------- ----- ------ - --------------------------- -------------------------- ---------- ----- -- - ---------------- -- ----------------------------------------- - ------- ------ -- --------------------------- ----- ---- -- - --------------------- -------- --------------- -------- -- -------------------- --- -- - -- ----- - ------------------ --------------- - --
在这个例子中,我们首先使用 pino 库创建了一个名为 stream 的可写流,并将它配置为输出的目标。然后,我们在 Fastify 的 onClose 钩子函数中关闭该流,以确保所有日志都被写入到文件中。最后,我们将可写流传递给 fastify-pino 插件,以便 Fastify 将日志输出到该流中。
通过环境变量控制日志输出
在不同的环境下,我们可能需要不同级别的日志输出,例如,在开发环境下,我们可能需要更详细的日志输出,而在生产环境下,我们可能需要更少的日志输出。
我们可以使用环境变量来控制日志输出级别。以下代码演示了如何根据环境变量来设置日志输出级别:
-- -------------------- ---- ------- ----- ------- - -------------------- --- -------- - ------ -- --------------------- --- -------------- - -------- - ------- - ----------------------------------------- - ------ -------- -- --------------------------- ----- ---- -- - --------------------- -------- --------------- -------- -- -------------------- --- -- - -- ----- - ------------------ --------------- - --
在这个例子中,我们首先定义了一个名为 logLevel 的变量,并将它设置为 'info'。然后,我们根据 NODE_ENV 环境变量的值来修改该变量的值。最后,我们将该值传递给 fastify-pino 插件,以便设置日志输出级别。
总结
通过使用 Fastify 提供的装饰器、输出格式、文件输出以及环境变量控制等技巧,我们可以优化 Fastify 日志输出,使其更符合我们的需求。除此之外,我们也可以使用其他日志工具和插件来进一步优化日志输出效果,以提高程序的可维护性和可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6450ff12980a9b385b9d7be4