Node.js 日志最佳实践指南

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 在 JavaScript 开发过程中,很多时候使用 console.log 来调试程序,算是比较常用的一个方法。

在 JavaScript 开发过程中,很多时候使用 console.log  来调试程序,算是比较常用的一个方法。

在开发阶段,无论是日志记录还是调试,都可以很容易地跟踪程序并检测到错误。但是在生产环境中,应该考虑更多关于日志记录的问题,因为这对于应用程序的监视和故障排除非常关键。

本文将介绍 Node.js 日志相关概念,并介绍比较受欢迎的日志脚本库。并在文章《Node.js 日志之winston使用指南》编码实践了简单的日志记录模块。

关于日志记录

志记录是将应用程序运行生成的信息记录到日志文件中的过程,保存在日志文件中的记录称为日志,日志是一种保存应用程序信息的简单方法。

日志是程序员追踪错误和事件流的首选方式,过去在服务器端程序开发中常用,而现在对于 WEB 前端来说也是必不可少。

对于前端开发,在开发过程中跟踪错误时,通常会使用 console.logdebugger

但是当应用程序进入生产环境并且用户开始与其交互时,就不能再使用 console.log。如果出现问题并且应用程序崩溃,也无法使用控制台获知。

这就是为什么需要一个简洁、干净、高效率的日志记录框架。相反,通过提供日志事件的实时流,这些日志可以用于实时诊断异常、恶意软件活动或未经授权的资源访问。

因此,日志将使开发人员、DevOps、SysAdmins或SecOps更容易了解和识别应用程序和基础设施问题的根源。

日志等级

这是任何日志系统中最重要的部分。日志等级是日志的元数据,该等级定义了记录事件信息的严重程度。首先设置日志等级的原因是为了可以快速查看哪些日志需要更多关注。通常日志等级有 5 个主要的等级,根据优先级排列如下:

  • ERROR:处理当前操作时发生了严重的问题/失败,此类日志是需要尽快处理的。
  • WARN:警告等级,并没有阻止应用程序继续,当检测到意外的应用程序问题时会发出告警日志。对于这个等级的日志一般检查一下以决定是否应该解决。
  • INFO:应用程序的正常行为
  • DEBUG:这个等级是为开发人员准备的,它以详细的方式提供诊断信息,通常用于获取诊断、故障排除或测试应用程序所需的信息。
  • TRACE:捕获有关应用程序行为的所有详细信息,主要用于详细跟踪应用程序逻辑。

注意:通常日志记录器的正常行为都只跟踪当前等级和以上等级的日志。因此,如果将日志等级设置为 INFO,则只会得到 INFOWARNERROR 级别的日志信息。

最佳原则

对于日志记录系统,通常都应该遵守以下 5 个基本原则:

1. 记录有意义和目的

不要添加不必要的日志,因为多余的日志信息会变成噪音。另外如果应用程序写日志的频率过高,将直接影响应用程序的性能。

注意:除非代码库有问题,否则就不应该在生产环境中启用 DEBUGTRACE 等级的日志。(解决问题后,确保将其切换回 INFOERROR 级别。)

2. 进行分割,避免造成大日志文件

如果对日志不进行分割,将会导致日志文件非常大,在分析时会很麻烦。同时对于文件日志来说,文件过大也将影响性能。可以为单独的日志等级使用单独的日志文件,或者可以尝试使用大多数日志框架中可用的滚动日志文件特性。根据时间或大小对日志文件进行分割压缩。

3. 应该按层次进行

正如上面介绍的,应该根据优先级等级处理日志。这将有助于在很短的时间内分析日志并发现问题。

另外,使用日志名称空间保持内容整洁,日志时间戳是日志信息必不可少的关键信息。

4. 不应该有副作用

这里说的副作用是指日志记录不能影响应用程序本身,不能因为日志记录导致严重的程序问题。

5. 不能记录任何敏感信息

在登录时,必须确保没有记录任何敏感信息,如用户登录名和密码、身份证、手机号码、银行卡号等。

上面 5 条是一个日志记录系统应该遵守的最低原则。下面介绍几个可以用于日志记录的框架,避免重复造轮子,提高效率。这些是 NPM 上可用的最流行的日志库:

  • Winston :灵活的通用日志库
  • Morgan : HTTP请求记录器中间件
  • Pino:超快(非常低的开销),纯原生 JSON 记录器
  • Loglevel:JavaScript最小的轻量级简单日志记录
  • log4js :没有运行时依赖的日志框架

总结

本文介绍了 Node.js 中日志相关概念,并介绍了 npm 上比较受欢迎的 5 个脚本库,有些脚本库可以支持多种语言和环境。现在的应用及平台业务逻辑都相对比较复杂,需要日志系统为其提供更好的服务,服务于应用及平台的改造、体验和升级。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
9天前
|
JSON 监控 JavaScript
Node.js-API 限流与日志优化
Node.js-API 限流与日志优化
|
11天前
|
缓存 负载均衡 监控
性能优化:Node.js高效服务器开发技巧与最佳实践
【10月更文挑战第29天】在Node.js服务器开发中,性能优化至关重要。本文介绍了几种高效开发的最佳实践,包括使用缓存策略、采用异步编程、实施负载均衡和性能监控。通过示例代码展示了如何实现这些技术,帮助开发者构建更快、更稳定的Node.js应用。
29 2
|
21天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
44 1
|
1月前
|
SQL 前端开发 JavaScript
Nest.js 实战 (十五):前后端分离项目部署的最佳实践
这篇文章介绍了如何使用现代前端框架Vue3和后端Node.js框架Nest.js实现的前后端分离架构的应用,并将其部署到生产环境。文章涵盖了准备阶段,包括云服务器的设置、1Panel面板的安装、数据库的安装、域名的实名认证和备案、SSL证书的申请。在部署Node服务环节,包括了Node.js环境的创建、数据库的配置、用户名和密码的设置、网站信息的填写、静态网站的部署、反向代理的配置以及可能遇到的常见问题。最后,作者总结了部署经验,并希望对读者有所帮助。
119 11
|
1月前
|
JavaScript 前端开发 Linux
在 Node.js 和 Electron 中获取设备 UUID 的最佳实践
【JS】在 Node.js 和 Electron 中获取设备 UUID 的最佳实践
55 1
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
44 2
|
3月前
|
SQL 运维 监控
Nest.js 实战 (十):使用 winston 打印和收集日志记录
这篇文章介绍了在Nest服务中如何使用Winston记录日志。文章首先强调了日志记录在后台服务中的重要性,接着提到Nest默认的内部日志记录器,并指出可以通过@nestjs/common包中的Logger类来全面控制日志系统的行为。文章还提到,为了在生产环境中实现更高级的日志功能,可以使用如Winston之类的Node.js日志包。接下来,文章介绍了如何在Nest服务中使用Winston记录日志,包括安装相关依赖、创建winston配置文件以及实现简单的日志记录示例。最后,文章指出更高级的自定义日志功能需要读者自己去探索。
115 2
Nest.js 实战 (十):使用 winston 打印和收集日志记录
|
2月前
|
开发者 Python
基于Python的日志管理与最佳实践
日志是开发和调试过程中的重要工具,然而,如何高效地管理和利用日志常常被忽略。本文通过Python中的logging模块,探讨如何使用日志来进行调试、分析与问题排查,并提出了一些实际应用中的优化建议和最佳实践。
|
3月前
|
SQL 数据库 Java
Hibernate 日志记录竟藏着这些秘密?快来一探究竟,解锁调试与监控最佳实践
【8月更文挑战第31天】在软件开发中,日志记录对调试和监控至关重要。使用持久化框架 Hibernate 时,合理配置日志可帮助理解其内部机制并优化性能。首先,需选择合适的日志框架,如 Log4j 或 Logback,并配置日志级别;理解 Hibernate 的多级日志,如 DEBUG 和 ERROR,以适应不同开发阶段需求;利用 Hibernate 统计功能监测数据库交互情况;记录自定义日志以跟踪业务逻辑;定期审查和清理日志避免占用过多磁盘空间。综上,有效日志记录能显著提升 Hibernate 应用的性能和稳定性。
49 0
|
3月前
|
开发者 Java 存储
JSF 与 CDI 携手共进,紧跟技术热点,激发开发者情感共鸣,开启高效开发新征程
【8月更文挑战第31天】JavaServer Faces (JSF) 与 Contexts and Dependency Injection (CDI) 在 Java EE 领域中紧密协作,助力开发者高效构建现代 Web 应用。JSF 凭借其丰富的组件库和页面导航功能受到青睐,而 CDI 则优雅地管理对象生命周期并实现依赖注入。两者结合,不仅简化了复杂企业应用的开发,还实现了松耦合架构,增强了代码的灵活性、可维护性和可扩展性。通过示例展示了如何利用 CDI 将业务服务对象注入 JSF Managed Bean,以及如何在不同页面间共享数据,突显了这一组合的强大功能。
39 0