日志介绍
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内存占用等等,都会影响服务器上的应用运行。
这部分属于运维的范畴,开发人员需要注意,可能需要协助排查问题。