随着前端开发的快速发展,越来越多的公司开始转向前端技术,依托于前端开发的人力资源,前端 API 监控及错误日志收集变得越来越重要。本文将详细介绍 Hapi 实现 API 监控及错误日志收集的方法,帮助开发人员顺利完成这一重要任务。
什么是 Hapi?
Hapi 是一个基于 Node.js 的 Web 框架,其主要用于创建 Web 服务器。它的架构相对于 Express 来说更加可拓展,具有更好的插件架构。Hapi 的设计理念是通过便捷、高效、安全的方式来构建可扩展的应用程序,并尽可能的减少开发的痛苦。
监控 API
API 监控是指对 API 的访问进行实时监测,应该同时监控成功和失败的请求并及时地通知开发人员,方便对问题进行追踪和处理。本文将带领读者通过 Hapi 实现 API 监控。
首先,我们需要在 Hapi 中初始化一个 Server,为了体现监控的作用,我们在其中新建一个 API,后面会讲到,这个 API 被访问到后会故意抛出一个异常,使得我们能够检测到异常并及时处理。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - --- -------------- ------------------- ----- ---- --- -------------- ------- ------ ----- ---- ---------------- --------- - ----- --- --------------- - --- ---------------
Hapi 通过 Plugin 的方式实现 API 的监控,下面我们会创建一个 Plugin 来进行 API 监控。Plugin 的作用是将业务代码从核心应用中隔离,同时可以通过插件配置来改变应用的行为。
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - --- -------------- ------------------- ----- ---- --- ----- ------ - - ----- ----------------- --------- ----- -------- -------- -- - ------- - ------- -- --- --------------------------- --------- -- -- - -- ------------------------ -- ------------ --- ----------- - -- -------- ------- -------- -------------------------------------- - ------ ----------- --- -------------- ------- ------ ----- ----------- --------- - -- ------ ------ ------ ------ - --- - -- ------ -- -- - ----- ------------------------ ----- --------------- -----
上述 Plugin 定义了一个 onPreResponse
的生命周期钩子,在服务响应请求之前触发,在这个钩子函数中,我们通过 request.response.isBoom
来检查响应是否存在异常。如果检测到异常并且不是来自于 /monitor
路径,我们就将异常信息记录在控制台中。最后,我们定义了一个路由返回错误列表。其中,register
方法是 Plugin 的注册函数,用于配置 Plugin。
现在,通过访问 http://localhost:3000/
来触发异常,会看到异常信息被写入了控制台中。通过访问 http://localhost:3000/monitor
来检查错误列表,其结果应该是:
error list
收集错误日志
API 监控能够帮助开发人员及时发现问题,但如果没有持久化存储,那么这些监控信息将仅仅是暂时的。下面我们通过 Hapi 实现收集错误日志的功能。
收集错误日志的流程如下:
- 用户访问 API 时,如果出现异常,异常信息将被记录在日志中。
- 通过日志收集工具定时读取日志中的异常信息。
针对上述要求,我们需要用到 Hapi 的另一个 Plugin,它叫做 good。good 是一个 Hapi 插件,提供了日志收集和分析等服务。下面我们分步骤来实现错误日志收集的功能。
首先,我们先需要安装 good 和 good-squeeze 这两个 npm 包。
npm install good good-squeeze --save
接着,我们创建一个 Logger,用于将日志信息写入文件中。
-- -------------------- ---- ------- ----- -- - -------------- ----- -------- - --------------------------- ----- ------ ------- -------- - -------------------- - --------------- --------- - ------------- - ------------- --------- --------- - ---------------------------- ------------------ ----------- - -
Writable
是 Node.js 中的一个流式处理类,用于处理数据写入,通过继承 Writable
类,我们可将数据写入文件中。上述代码定义了在 Logger 中增加的 _write
方法,该方法在写入数据时被调用,通过 fs.appendFileSync
来将数据写入文件中。
在实现比较简单的情况下,我们可以直接使用一个 built-in 对象。示例代码如下:
const fs = require('fs'); const { Console } = require('console'); const output = fs.createWriteStream('./stdout.log'); const logger = new Console(output); logger.log('Hello World');
接下来,通过 good 插件,我们可以将日志数据写入到我们定义的 Logger 对象中。我们需要定义一个 Server,将 Logger 注册到插件中,并读取这个插件中产生的日志数据。示例代码如下:
-- -------------------- ---- ------- ----- -- - -------------- ----- ---- - ---------------- ----- ---- - ---------------- ----- ------ - --- -------------- ------------------- ----- ---- --- ----- ------ ------- -------- - -------------------- - --------------- --------- - ------------- - ------------- --------- --------- - ---------------------------- ------------------ ----------- - - ----- ----------- - - ---- - --------- ---- -- ---------- -- ---------- - ------------- - - ------- --------------- ----- ---------- ----- -- ---- ---- --------- --- -- -- - ------- --------------- ----- ---------- -- - ------- ------- ----- -- ----- -------------------- ------------- -- - - - -- ----- ------- - - - --------- ---------------- -------- ----------- - -- ------ -- -- - ----- ------------------------- ----- --------------- -----
上述代码首先定义了一个 Logger 类,用于将数据写入文件中。在 goodOptions
中,我们指定了 good 插件的参数,我们设置了 fileReporter
,这样好的异常信息就会被输出到文件 logs/errors.log 中。同时,我们使用了上述定义的 Logger 对象,将异常信息写入到我们指定的文件中。
最后,通过访问 http://localhost:3000/
来触发异常,异常信息将被记录在 errors.log 文件中。
结论
本文深入介绍了 Hapi 实现 API 监控及错误日志收集的详细方法。Hapi 拥有非常好的插件架构,能够快速部署监控和日志收集的服务,方便开发人员及时发现和处理问题。希望读者能够通过本文深入了解 Hapi 在 API 监控及错误日志收集方面的应用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674c058714b275ea6fe0494a