您是否在为代码排错而感到困扰?是否正在寻找能简化调试过程的日志解决方案?请继续阅读,获取更多信息。
软件开发通常包含多个阶段:需求收集、分析、编码、测试和维护。在这些环节中,编码/开发阶段往往需要投入大量的时间和精力。软件工程师需要处理各种类型的错误,例如语法错误、逻辑错误和运行时错误。语法错误通常在编译阶段被识别出来,它们产生的原因是代码不符合编程语言的规则。
另一方面,集成开发环境 (IDE) 无法有效地识别逻辑错误和运行时错误,因此这些错误通常难以调试和修复。解决这些错误需要耗费大量时间,并且需要进行深入的调试工作。
调试是一个试图理解代码为何未能按照预期运行的过程。当我们明确知道错误所在以及代码中发生错误的确切位置时,解决问题就会变得相对容易。因此,日志记录对于代码调试非常重要且有效。
什么是日志记录?
日志记录是一种在程序执行期间捕获消息的技术。应该记录那些有助于调试的消息。因此,在代码中添加日志语句时机至关重要。此外,区分不同类型的日志语句同样重要。日志记录有不同的级别,例如信息、警告、错误、调试和详细。错误和警告语句用于处理异常情况。
例如,从函数返回的数据、数组操作的结果以及从API检索的数据等都可以使用信息级别的日志进行记录。调试和详细日志则用于提供错误的详细描述。
调试日志提供有关堆栈跟踪、输入输出参数等信息。“详细”日志级别的信息量不如“调试”日志详细,但它提供了所有已发生事件的列表。日志通常被写入控制台、文件和输出流。日志管理工具可以用于结构化和格式化日志记录。
Node.js 日志记录
Node.js 是一个 JavaScript 运行时环境。 Node.js 应用程序是异步和非阻塞的,通常用于数据密集型和实时系统。如果您想深入了解 Node.js,建议阅读相关的教程和文档。日志记录是提高性能、故障排除和错误跟踪所必需的。您可以使用内置的 console.log 函数在 Node.js 中进行日志记录。此外,还可以配合多个软件包来使用调试功能,从而提高效率。
中间件用于管理请求和响应。中间件可以是应用程序的一部分,也可以是任何其他 JavaScript 框架。可以通过应用程序和路由器对中间件进行日志记录。任何 Node.js 记录器都必须使用 npm 或 yarn install 命令进行安装。
Npm 代表 “Node Package Manager”,而 YARN 代表 “Yet Another Resource Negotiator”。 然而,Yarn 比 npm 更受欢迎,因为它速度更快,并且可以并行安装包。
以下是一些最佳的 Node.js 记录器:
Pino
Pino 是一个出色的 Node.js 应用记录器库。它是开源的,速度极快,并以易于阅读的 JSON 格式记录语句。Pino 的一些日志级别包括调试、警告、错误和信息消息。在项目中,您可以导入一个 Pino 记录器实例,并将 console.log 语句替换为 logger.info 语句。
使用以下命令安装 Pino:
$ npm install pino
生成的日志信息详尽,采用 JSON 格式,并突出显示日志的行号、日志类型、记录时间等。Pino 将应用程序中的日志记录开销降至最低,并且在处理日志时非常灵活。
Pino 可以与 Hapi、Restify、Express 等 Web 框架集成。Pino 生成的日志也可以存储在文件中。它使用 Worker 线程进行操作,并且与 TypeScript 兼容。
Winston
Winston 支持各种 Web 框架的日志记录,其主要特点是灵活性和可扩展性。它支持多种传输方式,可以将日志存储在不同的文件位置。传输是存储日志消息的地方。
除了一些内置的传输方式(如 HTTP、Console、File 和 Stream)之外,它还支持其他的传输方式,例如 CloudWatch 和 MongoDB。它支持多种级别和格式的日志记录。日志记录级别指示问题的严重性。
以下是不同的日志记录级别:
{ "error": 0, "warn": 1, "info": 2, "http": 3, "verbose": 4, "debug": 5, "silly": 6 }
日志输出格式也可以进行自定义、过滤和组合。日志包含时间戳、与日志关联的标签、从上一个日志经过的毫秒数等信息。
Winston 还可以处理异常和未捕获的 Promise。它还提供诸如查询运行时归档和流式日志等附加功能。首先,必须安装 Winston。然后,创建一个 Winston 配置对象以及用于存储日志的传输。使用 createLogger() 函数创建一个记录器对象,并将日志消息传递给它。
Node-Bunyan
Bunyan 用于以 JSON 格式快速记录 node.js。它还提供了用于查看日志的 CLI(命令行界面)工具。它轻量级,并支持各种运行时环境,如 Node.js、Browserify、Webpack 和 NW.js。使用漂亮的打印功能进一步美化了日志的 JSON 格式。日志具有各种级别,例如 fatal、error、warn、info、debug 和 trace;每个级别都有一个数值与之关联。
记录所有级别高于为实例设置级别的日志。 Bunyan 流是日志输出的地方。可以使用 log.child() 函数记录应用程序的子组件。所有子记录器都绑定到特定的父应用程序。流类型可以是文件、旋转文件或原始数据等。以下代码示例演示了如何定义流:
var bunyan = require('bunyan'); var log = bunyan.createLogger({ name: "foo", streams: [ { stream: process.stderr, level: "debug" }, ... ] });
Bunyan 还支持 DTrace 日志记录。 DTrace 日志记录涉及的探针包括 log-trace、log-warn、log-error、log-info、log-debug 和 log-fatal。 Bunyan 使用序列化程序以 JSON 格式生成日志。序列化程序函数不会抛出异常并且是防御性的。
日志级别
Loglevel 用于记录 JavaScript 应用程序。它也是 Node.js 中最好的记录器之一,因为它轻量级且简单。它记录给定的级别并使用不依赖于日志记录的文件。默认日志级别为 “警告”。日志输出与行号一起格式化。用于记录的一些方法包括跟踪、调试、警告、错误和信息。
它们可以在任何环境下适应失败。getLogger() 是一种用于检索记录器对象的方法。它还可以与其他插件结合使用,以扩展其功能。一些插件包括 loglevel-plugin-prefix、loglevel-plugin-remote、ServerSend 和 DEBUG。以下是向日志记录添加前缀消息的插件示例:
var originalFactory = log.methodFactory; log.methodFactory = function (methodName, logLevel, loggerName) { var rawMethod = originalFactory(methodName, logLevel, loggerName); return function (message) { rawMethod("Newsflash: " + message); }; }; log.setLevel(log.getLevel()); // 务必调用 setLevel 方法以应用插件
构建可以通过 npm run dist 命令运行,而测试可以使用 npm test 命令运行。日志级别支持 Webjar、Bower 和 Atmosphere 包。每当添加新功能时,都会发布新版本的 Loglevel。
Signale
Signale 由 19 个用于 JavaScript 应用程序的记录器组成。它支持 TypeScript 和范围日志记录。它由一个计时器组成,该计时器有助于记录时间戳、数据和文件名。除了 await、complete、fatal、fav、info 等 19 个记录器之外,还可以创建自定义日志。
可以通过使用记录器数据定义 JSON 对象和字段来创建自定义日志。也可以创建交互式记录器。当交互式记录器设置为 true 时,来自交互式记录器的新值会覆盖旧值。
Signale 最棒的部分在于它能够过滤掉秘密或敏感信息。多个秘密存储在数组中。 addSecrets() 和 clearSecrets() 是用于添加和清除数组中秘密的函数。 Boostnote、Docz、Shower、Taskbook 和 Vant 使用 Signale 进行日志记录。以下是从 Signale 调用 API 的语法:
signale.<logger>(message[,message]|messageObj|errorObj)
在撰写本文时,Signale 的下载量已超过 100 万次。
Tracer
Tracer 用于生成详细的日志消息。记录的消息由时间戳、文件名、行号和方法名组成。可以安装帮助程序包来自定义输出日志格式。可以使用以下命令安装帮助程序包:
npm install -dev tracer
Tracer 支持文件、流和 MongoDB 传输。它支持日志中的彩色控制台和过滤条件。首先,必须使用 npm install 安装 tracer。其次,必须创建一个记录器对象,并且必须选择控制台类型。然后,可以在对象上指定各种日志级别或类型以进行进一步的日志记录。
可以通过定义与函数体中存在的业务逻辑同步的函数来创建自定义过滤器。 tinytim 等微模板也可用于系统日志记录。
Cabin.js
Cabin 用于 node.js 应用程序的服务器和客户端日志记录。它用于需要屏蔽敏感和关键信息的情况。这包括信用卡号、BasicAuth 标头、盐、密码、CSRF 令牌和银行帐号。以下代码片段显示了如何使用 Cabin.js 进行日志记录。
const Cabin = require('cabin'); const cabin = new Cabin(); cabin.info('hello world'); cabin.error(new Error('oops!'));
它由 1600 多个字段名称组成。它还遵循自带记录器 (BYOL) 的原则。这使其与 Axe、Pino、Bunyan、Winston 等各种其他记录器兼容。由于自动流和 Cabin 缓冲区,它降低了磁盘中的存储成本。它是跨平台兼容的,并且易于调试。
服务器端日志记录需要使用中间件进行路由和自动输出日志记录。浏览器端日志记录需要 XHR 请求和脚本。它使用 Axe 来显示元数据,即有关数据、堆栈跟踪和其他错误的数据。 SHOW_STACK 和 SHOW_META 是布尔变量,设置为 true 或 false 以显示或隐藏堆栈跟踪和元数据。
Npmlog
Npmlog 是 npm 使用的一种基本类型的记录器。可以使用的一些日志记录方法包括 level、record、maxRecordSize、prefixStyle、heading 和 stream。它还支持彩色日志记录。各种日志记录级别是 silly、verbose、info、warn、http 和 error。以下是使用 npm 日志的示例代码片段。
var log = require('npmlog') // additional stuff ---------------------------+ // message ----------+ | // prefix ----+ | | // level -+ | | | // v v v v log.info('fyi', 'I have a kitty cat: %j', myKittyCat)
如果将 “Infinity” 指定为日志级别,则会抑制所有消息。如果将 “-Infinity” 指定为日志级别,则必须启用查看日志消息的选项才能查看日志。
事件和消息对象用于记录。使用前缀事件时会发出前缀消息。样式对象用于格式化日志,例如为文本和背景添加颜色,以及字体样式(如粗体、斜体、下划线等)。一些 npm 日志包包括 brolog、npmlogger 和 npmdate log 等。
Roarr
Roarr 是 Node.js 的记录器,它不需要初始化并且生成结构化数据。它具有 CLI 和环境变量,并且与浏览器兼容。它可以与 Fastify 和 Elastic Search 等集成,并可以区分应用程序代码和依赖代码。每条日志消息都由上下文、消息、序列、时间和版本组成。各种日志级别包括跟踪、调试、信息、警告、错误和致命。以下是有关如何使用 Roarr 进行日志记录的示例代码片段:
import { ROARR, } from 'roarr'; ROARR.write = (message) => { console.log(JSON.parse(message)); };
此外,可以对错误进行序列化,这意味着可以将带有错误的实例与对象的上下文一起记录下来。一些特定于 Node.js 和 Roarr 的环境变量包括 ROARR_LOG 和 ROARR_STREAM。“采取”是一个与 node.js 一起使用的函数,用于将上下文属性传递到各个级别。在记录时,子函数也可以与中间件一起使用。
总结
日志记录是一种在程序执行期间跟踪各种活动和事件的方法。日志在代码调试中起着至关重要的作用,并有助于提高代码的可读性。 Node.js 是一个开源的 JavaScript 运行时环境。一些优秀的 Node.js 记录器包括 Pino、Winston、Bunyan、Signale、Tracer 和 Npmlog 等。每种记录器都有其独特的功能,例如分析、过滤、流式传输和传输。
有些记录器支持彩色控制台,而有些记录器则适合处理敏感信息。详细且格式化的日志记录在开发人员尝试修复代码中的错误时提供了极大的帮助。JSON 格式通常是日志记录的首选,因为它以键值对的形式记录数据,使其对用户友好。
记录器还可以与其他应用程序集成,并且可以与多种浏览器兼容。在选择要使用的记录器类型之前,建议先了解您正在构建的需求和应用程序。
您还可以参考如何在 Windows 和 macOS 上安装 Node.js 和 NPM 的相关教程。