优化 Fastify 日志输出的技巧

阅读时长 7 分钟读完

在开发 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 等信息。

输出的日志将会像这样:

将日志输出到文件

默认情况下,Fastify 将日志输出到控制台,但是在一些情况下,我们可能需要将日志输出到文件中,例如,我们可能需要将日志集中储存以便于日志分析和监控。

我们可以使用 pino 库来将日志输出到文件中。以下代码演示了如何将日志输出到文件中:

-- -------------------- ---- -------
----- ------- - --------------------
----- -- - -------------
----- ---- - ---------------

----- ------ - ---------------------------

-------------------------- ---------- ----- -- -
  ----------------
--

----------------------------------------- -
  ------- ------
--

--------------------------- ----- ---- -- -
  --------------------- --------

  --------------- --------
--

-------------------- --- -- -
  -- ----- -
    ------------------
    ---------------
  -
--

在这个例子中,我们首先使用 pino 库创建了一个名为 stream 的可写流,并将它配置为输出的目标。然后,我们在 Fastify 的 onClose 钩子函数中关闭该流,以确保所有日志都被写入到文件中。最后,我们将可写流传递给 fastify-pino 插件,以便 Fastify 将日志输出到该流中。

通过环境变量控制日志输出

在不同的环境下,我们可能需要不同级别的日志输出,例如,在开发环境下,我们可能需要更详细的日志输出,而在生产环境下,我们可能需要更少的日志输出。

我们可以使用环境变量来控制日志输出级别。以下代码演示了如何根据环境变量来设置日志输出级别:

-- -------------------- ---- -------
----- ------- - --------------------

--- -------- - ------

-- --------------------- --- -------------- -
  -------- - -------
-

----------------------------------------- -
  ------ --------
--

--------------------------- ----- ---- -- -
  --------------------- --------

  --------------- --------
--

-------------------- --- -- -
  -- ----- -
    ------------------
    ---------------
  -
--

在这个例子中,我们首先定义了一个名为 logLevel 的变量,并将它设置为 'info'。然后,我们根据 NODE_ENV 环境变量的值来修改该变量的值。最后,我们将该值传递给 fastify-pino 插件,以便设置日志输出级别。

总结

通过使用 Fastify 提供的装饰器、输出格式、文件输出以及环境变量控制等技巧,我们可以优化 Fastify 日志输出,使其更符合我们的需求。除此之外,我们也可以使用其他日志工具和插件来进一步优化日志输出效果,以提高程序的可维护性和可靠性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6450ff12980a9b385b9d7be4

纠错
反馈