js状态(异常)监控
2014-11-10 22:58
302 查看
解决方案
我们先来比较两个方案各自的特点。try,catch的方案有如下特点:
无法捕捉到语法错误,只能捕捉运行时错误;
可以拿到出错的信息,堆栈,出错的文件、行号、列号;
需要借助工具把所有的function块以及文件块加入try,catch,可以在这个阶段打入更多的静态信息。
window.onerror的方案有如下特点:
可以捕捉语法错误,也可以捕捉运行时错误;
可以拿到出错的信息,堆栈,出错的文件、行号、列号;
只要在当前页面执行的js脚本出错都会捕捉到,例如:浏览器插件的javascript、或者flash抛出的异常等。
跨域的资源需要特殊头部支持。
对于跨域的JS资源,window.onerror拿不到详细的信息,需要往资源的请求添加额外的头部。静态资源请求需要加多一个Access-Control-Allow-Origin头部,同时script引入外链的标签需要加多一个crossorigin的属性。经过这样折腾后一样能获取到准确的出错信息。
window.onerror的方法要比try,catch方法更加完善,我们允许少量由于插件带来的脚本错误,最后window.onerror实现的方式是:
window.onerror = function(msg,url,line,col,error){ //没有URL不上报!上报也不知道错误 if (msg != "Script error." && !url){ return true; } //采用异步的方式 //我遇到过在window.onunload进行ajax的堵塞上报 //由于客户端强制关闭webview导致这次堵塞上报有Network Error //我猜测这里window.onerror的执行流在关闭前是必然执行的 //而离开文章之后的上报对于业务来说是可丢失的 //所以我把这里的执行流放到异步事件去执行 //脚本的异常数降低了10倍 setTimeout(function(){ var data = {}; //不一定所有浏览器都支持col参数 col = col || (window.event && window.event.errorCharacter) || 0; data.url = url; data.line = line; data.col = col; if (!!error && !!error.stack){ //如果浏览器有堆栈信息 //直接使用 data.msg = error.stack.toString(); }else if (!!arguments.callee){ //尝试通过callee拿堆栈信息 var ext = []; var f = arguments.callee.caller, c = 3; //这里只拿三层堆栈信息 while (f && (--c>0)) { ext.push(f.toString()); if (f === f.caller) { break;//如果有环 } f = f.caller; } ext = ext.join(","); data.msg = ext; } //把data上报到后台! },0); return true; };
后话
上线的稳定性不仅仅依托于代码异常的监控,代码异常监控只能监控到你代码的健康性,而很多时候业务的稳定还需要监控一些业务数据,例如昨天有1000个人点击了关注按钮,今天上线后突然变成了300人点击,除非你很清楚你上线的行为是会导致点击数下降,否则我们就应该重新审查这次上线是否存在问题,必要时还应该回退这次上线。原文地址:http://rapheal.sinaapp.com/2014/11/06/javascript-error-monitor/
相关文章推荐
- 【原】聊聊js代码异常监控
- 详解js前端代码异常监控
- C#实现对站点、程序池状态的监控,以及URL能正常返回的监控,状态异常,邮件预警
- 监控SQL Server数据库异常镜像状态发告警邮件 推荐
- 监控mysql主从同步状态是否异常
- iOS之网络—— AFN使用、检测网络状态、HTTPS基本使用、WebView基本使用、OC和JS、NSInvocation、异常处理
- js 实时监控网络状态
- 网络监控软件Nagios, Nagios是一款开源的免费网络监视工具,能有效监控Windows、Linux和Unix的主机状态,交换机路由器等网络设备,打印机等。在系统或服务状态异常时发出邮件或短信报
- Js前端代码异常监控
- 监控mysql主从同步状态是否异常,如果异常,则发生短信或邮寄给管理员
- js异常
- 异常详细信息: System.InvalidOperationException: ExecuteReader 要求已打开且可用的连接。连接的当前状态为已关闭。
- 通过JS实现文本框获得输入焦点时的状态
- JS判断点击行为而显示相应状态
- 用cacti 监控 cisco设备的端口状态(up/down)
- 监控服务器状态(LINUX系统)
- js 抛出异常 throw
- 设置Windows下的Core文件输出(监控异常进程)
- Smart Client Software Factory :使用 Visualizer 监控 SCSF 运行状态
- 写了一个简单的shell脚本监控mysql服务器运行状态