Skip to content
导航

日志介绍

Node.js Logging Tutorial 文章分6个方面Who、Why、What、When、Where、How介绍日志

Who

谁使用日志?根据业务场景的不同,可能有以下人员使用日志:

  • 运维:保障系统稳定
  • 开发:排查故障
  • 产品:根据访问数据规划产品
  • 交互设计:分析交互效果、用户偏好
  • 运营、销售:分析运营、销售效果
  • 用户:回顾操作过程等

日志一般会经过日志管理工具,汇总成图表,以便进行可视化分析

Why

为什么使用日志记录?有以下用途:

  • 性能记录:不仅是你,你的用户也关心性能。记录性能以了解真实的性能数据
  • 开发调试:人都会犯错,不可避免地需要调试错误,查看日志记录的报错信息
  • 错误跟踪:了解错误何时开始、发生的频率、发生对象、是否已解决以及是否重新出现
  • 分析日志:日志是信息源,可以提炼出分析用的图表数据

What

日志记录什么?

Node.js 日志记录的常见级别:

  • 错误,error
  • 警告,warn
  • 信息,info
  • 详情,verbose
  • 调试,debug

Node.js 日志输出有两种:

  • 标准输出,stdout
  • 标准错误,stderr

虽然都会打印到终端中,但在Node.js代码中获取日志的入口是不同的。

根据用途的不同,日志可以分为三类:

  • 异常
  • 信息
  • 调试

异常

在 Node.js 中,错误、警告两种日志级别会输出到标准错误,通过 process.stderr 访问。

错误、警告都属于异常,异常不都是由于代码问题导致的,也可能是运维问题、网络问题,这些问题同样会引起代码报错之类的连锁反应。开发者也可以处理这种异常,例如在获取数据的场景使用缓存数据返回,类似的开发措施我们一般称为“兜底”。

但有些错误是开发过程中无法预测的,例如损坏的数据,又称为“脏数据”。

积极处理错误并考虑尽可能多的兜底措施,看起来是个不错的想法,但这会占用开发人员大量的时间。时间宝贵,这也是为什么很多互联网产品会带着明显的问题上线的主要原因。

因此,处理错误可能不需要那么快速即时,但是可以先把错误以日志的形式记录下来,为解决错误做准备。

信息

在 Node.js 中,info、log两种日志级别会输出到标准输出,通过 process.stdout 访问。

信息一般由开发人员自定义输出,它们是程序正常运行中应该发生的日志,可能被用于显示程序运行状态、调试、查看详情,还可能被用于开发者互相交流,比如官网招聘、Ant Design 圣诞节彩蛋事件

调试

由于没有“标准调试”这种输出流,调试、详情这两种日志级别也会输出到标准输出。

调试日志可以包含堆栈跟踪、输入输出参数、开发信息等。

详情日志应当记录发生的每个事件,但不必要像调试日志那样记录事件的更多细节。

一致性

日志记录的一致性是重要的,共享约定、遵从约定来保持一致性,这样做不仅方便开发人员相互交流,也方便日志管理工具采集日志。

When

记录日志不是随时随地任意的,而是上下文结束后。

例如,测量一个函数的运行时间,相比在运行开始、运行结束各打一个日志,在函数运行结束后再记录运行时间到日志显然更简洁。又如,记录一个请求,也应当在请求结束后记录日志,减少日志的数量和复杂性。

记录日志时,是否需要实时写入?看情况,如果是输出到控制台,那么可以实时;如果要写入到日志文件,那么避免阻塞IO,应该按优先级排队写入。

Where

常见的日志位置有:

  • 标准输出、标准错误、控制台
  • 日志文件
  • 日志管理工具,将日志记录到数据库

How

Node.js 中如何记录日志?

  • console
  • debug 内置模块
  • 框架的中间件,例如express、koa支持中间件
  • 第三方库:Winston 是最流行的日志记录库,log4js 是更适合 JS 开发者的日志记录库

其他

不要忘记服务器日志记录。服务器的运行状态、网络连接、CPU内存占用等等,都会影响服务器上的应用运行。

这部分属于运维的范畴,开发人员需要注意,可能需要协助排查问题。

参考资料