在现代 Web 应用程序中,日志写入是十分重要的一项功能。日志记录可以帮助我们跟踪应用程序中的错误和问题,同时也可以让我们收集有用的数据以监控应用程序的性能。
Winston 是一个流行的 Node.js 日志系统,它是一个灵活而且模块化的工具,可以满足大部分日志需求。Fastify 是一个快速、低开销和可扩展的 Web 框架,非常适合构建高性能的 Web 服务。
本文将介绍如何在 Fastify 中使用 Winston 日志系统来记录日志。本文的重点是在 Fastify 应用程序中集成 Winston,并通过自定义 transporter 来记录日志信息到不同的输出目的地(如 stdout、文件、ELK 等)。
安装 Winston 和 Fastify
在开始以前,我们需要先确保安装了 Winston 和 Fastify。我们可以使用如下命令进行安装:
npm install fastify winston --save
在 Fastify Application 中集成 Winston
在 Fastify Application 中集成 Winston,我们需要在启动应用程序时创建一个 Winston 实例并将其注入到 Fastify application 中。
-- -------------------- ---- ------- ----- ------- - -------------------- ------- ---- -- ----- ------- - ------------------ ----- ------ - ---------------------- ------ ------- ------- ---------------------- ------------ - -------- ---------------- -- ----------- - --- ----------------------------- --- ------------------------- --------- ------------ ------ ------- -- - -- -------------------------- ------- ----------- - ------ ---------------- ----- --------- ------ -- - ----------------------- ---- ---------- ------ - ------ ------- - -- -------------------- ----- -------- -- - -- ----- ----- --- ------------------------ --------- -- ------------ --
在上面的示例代码中,我们使用 winston.createLogger
方法创建了一个新的 Winston 实例,并使用了 winston.transports.Console
和 winston.transports.File
这两个传输器实例将日志记录到控制台和 error.log
文件中。
我们还使用了 Fastify 的 .decorate()
方法来将 Winston 实例绑定到 Fastify application中,这样每一个请求都可以通过 request.log
访问到日志记录。另外我们也将 Winston 实例赋值到了 fastify.log
属性中,这样我们就可以在启动 Fastify 服务器时通过 Fastify 的 API 记录日志了。
记录日志
现在,我们已经将 Winston 集成到 Fastify 应用程序中,让我们来记录一条日志信息。
fastify.get('/', async (request, reply) => { request.log.info('Hello from Fastify!') return { hello: 'world' } })
在上面的代码片段中,我们可以看到 request.log
对象是由 Fastify 注入的,通过 request.log
我们可以访问到我们之前创建的 Winston 实例。我们可以使用各种级别的日志记录来标记不同的日志信息。在上面的示例代码中,我们使用 request.log.info()
方法将 "Hello from Fastify!" 的日志信息记录下来。
自定义 transporter
在接下来的例子中,我们将会探索如何自定义一个 transporter,将日志记录到 ELK 系统中。我们将重写一个 WinstonTransportStream
方法。
-- -------------------- ---- ------- ----- ------------- - -------------------------------- ----- --------------- - - ------ ------- ------------ ----------------- ----------- - ----- ----------------------- - - ----- ----------- - --- ------------------------------ ----- --------- ------- ----------------- - ----------------- - ----------- --------- - ----------- ---------- - ---------- -- ------ - --------- --------- - --------------- -- - ------------------- ----- -- --------------------- -- -- - ---------- -- - -
在上述代码中,我们使用了 winston-elasticsearch
插件来将日志信息记录到 ES 中。在自定义 transporter 的类名后,我们重写了 log()
方法,将传入的日志信息使用 esTransportOpts
配置选项记录到 Elasticsearch 中。
在上述日志配置中,我们将日志的默认记录级别设置为 info
,将记录索引设置为 'fastify-server',Elasticsearch 的 API URL 设置为 http://localhost:9200。
现在,我们只需要在 Winston transporter 的传输器列表中加入我们自定义的 transporter 即可。
-- -------------------- ---- ------- ----- ------- - -------------------- ------- ---- -- ----- ------- - ------------------ ----- ------------- - -------------------------------- ----- --------------- - - ------ ------- ------------ ----------------- ----------- - ----- ----------------------- - - ----- ----------- - --- ------------------------------ ----- --------- ------- ----------------- - ----------------- - ----------- --------- - ----------- ---------- - ---------- -- ------ - --------- --------- - --------------- -- - ------------------- ----- -- --------------------- -- -- - ---------- -- - - ----- ------ - ---------------------- ------ ------- ------- ---------------------- ------------ - -------- ---------------- -- ----------- - --- ----------------------------- --- ------------------------- --------- ------------ ------ ------- --- --- -------------------------- - -- -------------------------- ------- ----------- - ------ ---------------- ----- --------- ------ -- - ----------------------- ---- ---------- ------ - ------ ------- - -- -------------------- ----- -------- -- - -- ----- ----- --- ------------------------ --------- -- ------------ --
在上述代码中,我们创建了一个新的 ELKLogger
transporter 对象,并将其添加到了传输器列表中。此外,在 Winston options 中,我们将默认的记录器级别设置为 info
级别,将记录索引设置为 fastify-server
,并将 Elasticsearch 服务器的 API URL 设置为 http://localhost:9200。
现在,启动 Fastify 服务器并使用我们自定义的 transporter 记录日志信息到 Elasticsearch。
结论
在本文中,我们详细介绍了如何在 Fastify 中使用 Winston 日志系统,并通过自定义 transporter 特性进行了深入的学习和分析。我们演示了如何将日志记录到不同的目的地,如 stdout、文件、ELK 等。
日志写入功能对于 Web 应用程序非常关键,因此我们强烈建议您在 Fastify 应用程序中使用 Winston 日志系统。它为您提供了灵活、模块化且易于使用的 API,可以满足大部分的日志需求,使您能够更好地跟踪和监控您的应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671fc6e82e7021665eff7661