在 JavaScript 开发过程中,很多时候使用 console.log
来调试程序,算是比较常用的一个方法。
在开发阶段,无论是日志记录还是调试,都可以很容易地跟踪程序并检测到错误。但是在生产环境中,应该考虑更多关于日志记录的问题,因为这对于应用程序的监视和故障排除非常关键。
本文将介绍 Node.js
日志相关概念,并介绍比较受欢迎的日志脚本库。并在文章《Node.js 日志之winston使用指南》编码实践了简单的日志记录模块。
关于日志记录
志记录是将应用程序运行生成的信息记录到日志文件中的过程,保存在日志文件中的记录称为日志,日志是一种保存应用程序信息的简单方法。
日志是程序员追踪错误和事件流的首选方式,过去在服务器端程序开发中常用,而现在对于 WEB 前端来说也是必不可少。
对于前端开发,在开发过程中跟踪错误时,通常会使用 console.log
或 debugger
。
但是当应用程序进入生产环境并且用户开始与其交互时,就不能再使用 console.log
。如果出现问题并且应用程序崩溃,也无法使用控制台获知。
这就是为什么需要一个简洁、干净、高效率的日志记录框架。相反,通过提供日志事件的实时流,这些日志可以用于实时诊断异常、恶意软件活动或未经授权的资源访问。
因此,日志将使开发人员、DevOps、SysAdmins或SecOps更容易了解和识别应用程序和基础设施问题的根源。
日志等级
这是任何日志系统中最重要的部分。日志等级是日志的元数据,该等级定义了记录事件信息的严重程度。首先设置日志等级的原因是为了可以快速查看哪些日志需要更多关注。通常日志等级有 5 个主要的等级,根据优先级排列如下:
ERROR
:处理当前操作时发生了严重的问题/失败,此类日志是需要尽快处理的。WARN
:警告等级,并没有阻止应用程序继续,当检测到意外的应用程序问题时会发出告警日志。对于这个等级的日志一般检查一下以决定是否应该解决。INFO
:应用程序的正常行为DEBUG
:这个等级是为开发人员准备的,它以详细的方式提供诊断信息,通常用于获取诊断、故障排除或测试应用程序所需的信息。TRACE
:捕获有关应用程序行为的所有详细信息,主要用于详细跟踪应用程序逻辑。
注意:通常日志记录器的正常行为都只跟踪当前等级和以上等级的日志。因此,如果将日志等级设置为
INFO
,则只会得到INFO
、WARN
和ERROR
级别的日志信息。
最佳原则
对于日志记录系统,通常都应该遵守以下 5 个基本原则:
1. 记录有意义和目的
不要添加不必要的日志,因为多余的日志信息会变成噪音。另外如果应用程序写日志的频率过高,将直接影响应用程序的性能。
注意:除非代码库有问题,否则就不应该在生产环境中启用
DEBUG
或TRACE
等级的日志。(解决问题后,确保将其切换回INFO
或ERROR
级别。)
2. 进行分割,避免造成大日志文件
如果对日志不进行分割,将会导致日志文件非常大,在分析时会很麻烦。同时对于文件日志来说,文件过大也将影响性能。可以为单独的日志等级使用单独的日志文件,或者可以尝试使用大多数日志框架中可用的滚动日志文件特性。根据时间或大小对日志文件进行分割压缩。
3. 应该按层次进行
正如上面介绍的,应该根据优先级等级处理日志。这将有助于在很短的时间内分析日志并发现问题。
另外,使用日志名称空间保持内容整洁,日志时间戳是日志信息必不可少的关键信息。
4. 不应该有副作用
这里说的副作用是指日志记录不能影响应用程序本身,不能因为日志记录导致严重的程序问题。
5. 不能记录任何敏感信息
在登录时,必须确保没有记录任何敏感信息,如用户登录名和密码、身份证、手机号码、银行卡号等。
上面 5 条是一个日志记录系统应该遵守的最低原则。下面介绍几个可以用于日志记录的框架,避免重复造轮子,提高效率。这些是 NPM 上可用的最流行的日志库:
- Winston :灵活的通用日志库
- Morgan : HTTP请求记录器中间件
- Pino:超快(非常低的开销),纯原生 JSON 记录器
- Loglevel:JavaScript最小的轻量级简单日志记录
- log4js :没有运行时依赖的日志框架
总结
本文介绍了 Node.js 中日志相关概念,并介绍了 npm 上比较受欢迎的 5 个脚本库,有些脚本库可以支持多种语言和环境。现在的应用及平台业务逻辑都相对比较复杂,需要日志系统为其提供更好的服务,服务于应用及平台的改造、体验和升级。