腾讯开发工程师:前端异常监控到底怎么做

快速迭代是腾讯产品的生命力

稳定性则是互联网产品的主基调

本期直播课浅谈我们在前端异常的探索和实践

让我们对异常时刻警惕


腾讯开发工程师:前端异常监控到底怎么做

| 导语 从事Web前端同学对此肯定深有体会,代码发出去之后,犹如脱缰的野马,运行在万千的客户终端上,等到产品和后台反馈问题到我们这边,很多时候定位问题只能靠猜,尤其是一些偶发诱因,因为根本不知道用户是如何操作的,真实环境遇到的问题通常是很多随机因素叠加的形成的,因此很难回放用户的操作来还原现场找到原因。

现在的痛点

1、用户反馈问题后,有时候虽然我们查询了js报错日志和cgi调用,但是没有发现任何错误,我们根本不知道用户的终端上到底发生了什么。

2、目前使用的js错误上报系统,看到上报有一定的延时,作为一款金融产品,分秒必争,这短暂的延时可能是致命的,我们必须快速的找到原因并予以修复。


经过一段时间经验的累积,我们想到,如果我们有一个同后台一样详实的可分类和检索的代码运行日志,无疑将会提供巨大的帮助。

我们的探索

一个健壮的日志系统大致包含日志记录、日志上传和日志分析三个主要部分,在这次的实践中,我们对这三方面都有所探索。

1、日志到底存哪里?

由于前端受到很多限制,不能同APP一样可以在文件沙箱内存取文件,因此如何持久化的存储日志成了一个问题。目前H5也支持若干种本地存储方案,cookie, localStorage, indexedDB和websql等,其他的由插件提供的能力不在考虑的范围之类,如flash,移动端的可用性会是一个很大的问题。

  • Cookie

    不用想,应该没有人会考虑吧, Cookie的原则应该是尽可能的精简避免浪费带宽。

  • localStorage

    localStorage大家应该都很熟悉,一个简单的键值存储系统,接口简单实用,兼容性也非常的棒。但是考虑到目前很多项目都有使用localStorage来做缓存,而localStorage本身是有大小限制的。根据日志记录的细粒度,很可能会产生较多的日志内容,如果也记录在localStorage里,可能会有超出容量限制的风险。因此,localStorage应该作为一个备用的持久化方案。

  • websql

    websql作为一项W3C标准,目前已经被废弃,但是各大桌面浏览器和移动端浏览器都有很好的实现这个接口,兼容性问题不大,底层基本上都是sqlite(正是因为这样,作为一个web标准是不可接受的)。因而日志作为大量的结构化数据,应用场景非常的适合。经测试,在iOS上容量最大支持50MB,不过如果使用系统自带的safari,超过5MB时,会主动提醒用户是否要增加数据库的大小,不是很友好,不过微信里到是不会。想想5MB独占作为日志存储基本上够用了,处理好过旧日志的清理工作即可。因此我们觉得websql应当作为当前阶段主要的解决方案。

  • indexedDB

    IndexedDB 是一种可以让你在用户的浏览器内持久化存储数据的方法,作为下一代的客户端结构化数据持久存储方案,足够的强大和高效,目前在各大浏览器中也有很好的支持,是未来用来替换websql的方案,应当在日后的迭代中主要支持。

2、什么样的日志格式堪称优雅?

  • 时间戳,这个无需多说,时间戳是日志的基本要义。

  • 多会话,一个前端工程中可能同时存在多个独立的模块,这些模块很可能会同时互不干扰的记录各自的日志。如果每个模块都在自己的会话下记录日志,就不会相互干扰,并且提供了另一个维度的过滤能力。

  • 错误等级,如 infowarningerrorcritical 等,以提供最为基本的过滤能力。

  • 描述符,如 verify.request.startsubmit.prevented 等等。尽可能的以便用户一眼就可以知晓日志的大致内容,也方便代码中日志记录代码的可读性,也更易于在代码中搜索。

  • 数据和详情,有时候一个简单的描述符并不能说明问题,可能需要记录更多的描述性文本或者数据来分析问题。

3、日志如何获取?

由于我们并不需要实时的获取来自客户端的大量日志,因此日志是存储在用户客户端本地的,我们需要后台配合开发一个用于接收客户端通过网络上传的日志内容并存储起来的接口。同时可能要考虑一些安全性问题,如引入token机制和验证登录态等等。目前我们腾讯微证券采用的方案为:用户在微信公众号中发送消息“问题反馈”(直接使用日志上报等关键词可能会引起用户的反感),后台会返回日志上传页面地址链接,用户点击链接进入后,在获取登录态后自动上报日志。

4、日志分析如何分析?

由于Logline上传的日志格式符合标准,具有良好的可阅读性,因此我们可以在某种程度上直接使用命令行工具或者编辑器来阅读。但是对命令行不熟悉的用户使用可能仍然有困难,因此有必要使用Web技术栈搭建一个易于使用并且视觉良好的工具。我们希望这套工具可以不依赖于后端,既可以部署在服务器端,也可以当做本地网页直接双击打开,也可以被简单的包一层外壳而当做桌面APP来使用。

作为日志,承载的最主要的内容便是大量的纯文本,在调研了一些方案后,我们认为H5规范中的FileReader.readAsText可以很好的做到这一点,结合拖放事件,我们便可以很大致构建出一个不错的方案:用户将一个或者多个日志文件拖放至网页中,即可对这些日志批量分析和检索。

基于以上工作,我们腾讯微证券项目组推出了自己的解决方案:We.Logline,一个轻量,实用和客户端级的前端日志记录工具。


上一篇:JavaScript 删除 Local Storage


下一篇:localStorage使用总结