Logger
为何要做前端日志?
- 日志用来记录用户操作、系统运行状态等,是一个系统的重要组成部分。
- 日志记录的好坏直接关系到系统出现问题时定位的速度,同时可以通过对日志的观察和分析,提前发现系统可能的风险,避免线上事故的发生。
日志级别
- 一个项目各个log级别的定义应该是清楚明确的,是每个开发人员所遵循的
- 要保证除了开发人员自己以外,测试人员、运维人员都可以方便地通过日志定位问题
FATAL 致命错误
- 表示需要立即被处理的系统级错误。
- 当该错误发生时,表示服务已经出现了某种程度的不可用,系统管理员需要立即介入。
- 这属于最严重的日志级别,因此该日志级 别必须慎用,如果这种级别的日志经常出现,则该日志也失去了意义。
- 通常情况下,一个进程的生命周期中应该只记录一次 FATAL 级别的日志,即该进程遇到无 法恢复的错误而退出时。
- 如果某个系统的子系统遇到了不可恢复的错误,那该子系统的调用方也可以记入 FATAL 级别日志,以便通过日志报警提醒系统管理员修复。
logger.fatal('TYPE', 'log-body')
console.error('[TIME]', ':', '[LEVEL]', 'TYPE', '-', 'log-body')
ERROR 错误
- 该级别的错误也需要马上被处理,但是紧急程度要低于 FATAL 级别。
- 当 ERROR 错误发生时,已经影响了用户的正常访问。
- ERROR 错误和 FATAL 错误对用户的影响是相当的: FATAL 相当于服务已经挂了,而 ERROR 相当于好死不如赖活着,然而活着却无法提供正常的服务,只能不断地打印 ERROR 日志。
- ERROR 和 FATAL 都属于服务器自己的异常,是需要马上得到人工介入并处理的,而对于用户自己操作不当,如请求参数错误等等,是绝对不应该记为 ERROR 日志的。
logger.error('TYPE', 'log-body')
console.error('[TIME]', ':', '[LEVEL]', 'TYPE', '-', 'log-body')
WARN 警告
- 该日志表示系统可能出现问题,也可能没有,这种情况如网络的波动等。
- 对于那些目前还不是错误,然而不及时处理也会变为错误的情况,也可以记为WARN日志,例如一个存储系统的磁盘使用量超过阀值,或者系统中某个用户的存储配额快用完等等。
- 对于 WARN 级别的日志,虽然不需要系统管理员马上处理,也是需要及时查看并处理的。
- 此种级别的日志也不应太多,能不打 WARN 级别的日志,就尽量不要打。
logger.warn('TYPE', 'log-body')
console.warn('[TIME]', ':', '[LEVEL]', 'TYPE', '-', 'log-body')
INFO 调试日志
- 该种日志记录系统的正常运行状态,例如某个子系统的初始化,某个请求的成功执行等等。
- 通过查看 INFO 级别的日志,可以很快地对系统中出现的 WARN, ERROR, FATAL 错误进行定位。
- INFO 日志不宜过多,通常情况下,INFO 级别的日志应该不大于 TRACE 日志的 10%。
logger.info('TYPE', 'log-body')
console.info('[TIME]', ':', '[LEVEL]', 'TYPE', '-', 'log-body')
TRACE
- TRACE日志同 INFO/DEBUG 日志的区别在于是否打印当前运行代码的调用堆栈。
logger.trace('TYPE', 'log-body')
console.trace('[TIME]', ':', '[LEVEL]', 'TYPE', '-', 'log-body')
速度 / 异常
- Web Performance API
- JS Error 抛出:EvalError / InternalError / RangeError / ReferenceError / SyntaxError / TypeError / URIError / new Error()
try {
functionThatMightThrow();
} catch (error) {
// One option (more noisy than console.log):
console.error(error);
// Another option:
notifyUserOfError(error);
// Another option:
reportErrorToService(error);
// OR do all three!
}