原标题:前端异常采集(附实例)

为什么要做前端代码异常采集?好问题!

为了用户能安心用产品,不至于时不时“卡壳”崩溃。

为了能高效定位线上代码的异常并提供简单提示信息。

为了程序猿同胞们能睡个好觉。

拥有大量用户的互联网产品都值得拥有一款好的前端监控方案,并且该方案是后端监控无法替代的,我司也开发了自己的前端监控脚本及监控系统,其中前端异常采集是前端监控的一个重要部分。

捕获异常的方法

js捕获异常的方法,两三个而已。

try…catch 优缺点已有很多论述和解决方案,本文的异常采集并未建立在该方法之上,只是少量使用。

window.和方法3类似但不如方法3强大,因此未选用此方法。

window.addEventListener(‘error’,function(){},true),采用此方法。

前端异常包含两部分:

第一部分:window.()能捕获到的异常,当然如果用addEventListener无论冒泡还是捕获阶段也能捕获到该异常。

第二部分:资源加载失败,即、<>标签上的,这个异常无法通过冒泡到达window,但是可以在捕获阶段拿到,这就是为什么要将addEventListener第三个参数置成true了。

注意:为保证该异常采集脚本能执行到,不被先行执行的脚本里面的报错阻断,该脚本要放到最前面。

可能的异常及采集方案

资源加载失败,样式、图片、脚本文件的请求异常,比如js加载404了

js脚本异常,即控制台常见的Error信息

检测HTML劫持,比如被运营商强行注入标签或脚本

页面样式丢失,CSS 展现异常

1. 资源加载失败

http异常用js几乎抓不到有用异常信息,但是404异常可以进行简单处理,此时是不会执行的回调函数的。因为在addEventListener捕获到的异常信息中你可以发现,对应于的五个回调参数根本不存在了,但是addEventListener中除这五个外,还有其他可以用的key,如果想获取加载失败的资源是哪个,可以去target中找些有用信息,我使用的是e.target.outerHTML

"HttpError at " + (e.target.baseURI || location.href) + " outerHTML:" + e.target.outerHTML2. js异常

一般需要采集的信息:

异常的提示信息,会直接告诉你是什么异常。这是识别一个异常的最重要依据,即e.message中的信息。

JS 文件名:异常发生在那个文件中。是堆栈信息中最顶层的那个文件。即e.filename。

异常所在行、列:异常的具体位置。行信息各浏览器基本还是一致的,列信息的差别较大,仅供参考。

堆栈信息:异常信息发生的堆栈,也是函数调用的堆栈信息,每下一层都是上一层的运行环境。即e.error.stack。每一层都包含类型、文件、行、列信息。但是注意堆栈信息可能会比较多,可以根据需要截取上报。safari和firfox的e.error.stack中不包含以上1,2,3的信息,只有堆栈信息,而chrome和IE中都包含,此处需要做兼容处理。

发生异常的设备信息,可以从window.navigator中选取自己需要的信息,或者直接使用window.navigator.userAgent

发生异常的时间点,不多说。

js主动抛出异常

js异常除了可以是系统抛出的几类异常,还可以是开发者利用throw关键字主动抛出异常。

值:可以是字符串、数字逻辑值或对象

使用方式:

//利用Error对象或其实例,采集到的异常系统自动为其添加了堆栈信息,和系统抛出异常基本类似throw new Error('Problem deion.')throw Error('Problem deion.') //直接利用关键字抛出内容,会完全复写event.error的内容,不推荐使用。throw 'Problem deion.' throw null

另外:console.error()和throw new Error()抛出的错误信息是有本质区别的。前者不会阻断js运行,也不会被error事件捕捉到,只是在控制台打印错误信息。

以下方式可以阻止异常信息在控制台中显示,线上可以自行收集异常信息后阻止外人看到控制台报错,开发环境不建议使用。

window.addEventListener('error', (function(e) { console.log("-----errorEvent----", e) e.preventDefault() //这里换成 return false或return true均不行! }), true);window. = function(msg, url, line, col, error) { console.log("------errorInfo---",msg, url, line, col, error) return true; //这里用return false不行! }3. 检测html劫持

我选用的方案是保存真实环境中的html信息,并对比原html,检测是否有被篡改。

采集html文档用到的是document.documentElement.outerHTML。但是有一点需要注意,上面已提到,该文件需要放在最前面,所以直接用该方法拿到的可能只有

中的html。因此如果想拿到完整的页面信息,需要将采集时间点放到以后。

//所有io操作最好都try...catch一下,这里是防止储存的信息超过localStorage的最大限制。关于最大限制是多少已经有不少人说过了,大家可以选择性看一些,如果有必要可以亲测一下。window.addEventListener("load", function() { try { localStorage.setItem("hawkeyeHtml", document.documentElement.outerHTML); } catch (e) { //超过限度时,chrome和safari的e.name为'QuotaExceededError',FF的e.name为'NS_ERROR_DOM_QUOTA_REACHED' console.error(e) } })4. 页面样式丢失

尚未做此数据采集和监控,目前考虑大体思路和html劫持类似,保存截屏图片,用一定算法和正常样式下做对比,超过一定差异值即判定为样式异常。

数据处理方式:

上报监控服务器:便于统一监控异常数量类型等

方案:我司仍选择img的属性src进行上报,一是考虑到解析性能,二是考虑到要为多站点服务,方便跨域上报。

html页面打印前端异常:便于快速准确定位某使用环境崩溃原因

方案:采集到信息储存在localstorage中,注意控制储存的条数。在需要查看异常信息的网站中增加该页面,取出进行简单处理即可。

缺陷处理

线上代码是混淆压缩的,无行号

解决方案:线上也用sourceMap来解决,至于sourMap是什么,怎么使用,根据项目不同,可自行google。

跨域的js,异常信息只有一个” error”。虽然js拿不到任何其他异常信息,但是控制台能打印出全部异常信息。

解决方案一:匹配到” error”,引导开者去控制台查看或直接过滤掉。

解决方案二:解决跨域问题,分两步。一:静态资源请求需要加多一个Access-Control-Allow-Origin头部。二:标签加上crossorigin属性

点击查看原文可获取本文的样例代码。

作者:凌霄,娱票儿研发中心前端基础平台建设部前端开发工程师

关于21CTO社区

21CTO是一个深度、个性化的技术媒体和社区。定位在提供高品质的教育培训、学习分享、人才服务的平台。汇聚国内外IT互联网最优秀的CTO&技术专家,连接人与知识的价值服务。

投稿:info@21cto.com QQ群: 79309783返回搜狐,查看更多

责任编辑:

监控html页面数据获取失败,前端异常采集(附实例)相关推荐

  1. 构建可靠的前端异常监控服务-采集篇

    http://jdc.jd.com/archives/2175 在 Web 应用异常复杂的今天,一个页面不单单只包含文字.图片和超链接,还可能包含复杂表单.大量动画.海量交互.很多 Web 应用完全单 ...

  2. [转] 前端异常监控解决方案研究

    前端监控包括行为监控.异常监控.性能监控等,本文主要讨论异常监控.对于前端而言,和后端处于同一个监控系统中,前端有自己的监控方案,后端也有自己等监控方案,但两者并不分离,因为一个用户在操作应用过程中如 ...

  3. 调用后台接口返回报错前端隐藏提示_前端异常监控解决方案研究(转)

    前端监控包括行为监控.异常监控.性能监控等,本文主要讨论异常监控.对于前端而言,和后端处于同一个监控系统中,前端有自己的监控方案,后端也有自己等监控方案,但两者并不分离,因为一个用户在操作应用过程中如 ...

  4. 前端异常监控调研总结

    前端异常监控 一.异常监控系统 二.异常情况 三.异常表现分类 四.Web前端监控分类 五. 监控分类解析 六 错误分类和捕获 七 小程序异常监控 八 前端异常上报方式 一.异常监控系统 前端和后端处 ...

  5. 腾讯CDC团队:前端异常监控解决方案

    前端监控包括行为监控.异常监控.性能监控等,本文主要讨论异常监控.对于前端而言,和后端处于同一个监控系统中,前端有自己的监控方案,后端也有自己等监控方案,但两者并不分离,因为一个用户在操作应用过程中如 ...

  6. 【大厂】544- 腾讯CDC团队的前端异常监控解决方案~

    作者:Tencent CDC https://cdc.tencent.com/2018/09/13/frontend-exception-monitor-research/ 前端监控包括行为监控.异常 ...

  7. 爱奇艺智能前端异常监控平台的设计与实践

    背景 前端监控一般包括三方面:异常监控.性能监控(First Meaningful Paint.First Contentful Paint等性能指标监控)及行为数据监控(PV.UV.页面停留时长等监 ...

  8. 前端异常监控解决方案研究

    摘要: 异常监控不复杂也不简单啊... 原文:前端异常监控解决方案研究 作者:frustigor 前端监控包括行为监控.异常监控.性能监控等,本文主要讨论异常监控.对于前端而言,和后端处于同一个监控系 ...

  9. 直播回顾丨神策数据王朋:如何搭建一套高可用的前端异常监控系统?

    本文根据神策数据资深前端研发工程师王朋在神策「大数据技术系列直播课」第二季"前端专题"第四讲的直播整理. 本次分享主要分为三大部分:前端异常监控概述,异常监控的背景意义,以及做一个 ...

最新文章

  1. mysql事务的提交和回滚
  2. java注解编程_java 注解 基本原理 编程实现
  3. 博客园CodingLife模板样式优化
  4. linux管理之磁盘信息和进程管理
  5. bootstrap插件(对话框)bootbox参数和自定义弹出框宽度设置
  6. 7-2 组织星期信息 (10 分)
  7. 智能优化算法:入侵杂草优化算法-附代码
  8. creo不完全约束_Creo绘图1:1输出AutoCAD配置方法详解,工程图输出再不用担心尺寸乱变!...
  9. JavaScript 数组方法every()
  10. Java 已知直角三角形周长,求整数边
  11. pandas 报警告:A value is trying to be set on a copy of a slice from a DataFrame
  12. 什么时候找客户聊天才是最佳时间呢?
  13. 零售EDI:家乐福Carrefour EDI需求分析
  14. 手札-11(京东实战手札)
  15. 算法分析与设计(一)——0-1背包问题
  16. 文献阅读2019-Computer-aided diagnosis system for breast ultrasound images using deep learning
  17. 五分钟法则(five minute rules)
  18. Android挂逼修炼之行---微信摇骰子和猜拳作弊器原理解析
  19. access查找楼号为01_Access 应用基础—查询设计(一)
  20. 2023新版微信九块九进群系统源码+全解的

热门文章

  1. 机构能否通过做空A50来拉下A股市场?#每天来点真金融#
  2. 计算机如何显示e盘文档,我把电脑E盘里文件隐藏了,怎么弄可以显示出来!
  3. 博导给的韦来生数理统计课后习题答案,现在分享给大家!
  4. 模拟输入H.264流,输出封装格式文件
  5. 域名生成算法(DGA)基础总结
  6. 自动提取网页文章或者文章的免费软件
  7. keil写文字怎么会乱码_刚刚!2020福建高考作文题出炉!你会怎么写?
  8. pycharm设置字体样式_Pycharm IDE设置系列教程(三):配置颜色和字体
  9. 这4个正经的网站,能看片还能涨知识!
  10. SLM6500充电板的电磁干扰EMI措施