betterjs / badjs-report Goto Github PK
View Code? Open in Web Editor NEWmonitor error and report
License: MIT License
monitor error and report
License: MIT License
[Object Event] 是某些浏览器,特别是移动端上面,当script 资源加载失败的时候,会触发 onerror 的回调,而且onerror 的第一个参数是 event 对象, 详细见 #4
error.stack 进行 stringify是会有该错误,主要是error.stack某些情况下(或者某些浏览器下)是 [object event] 对象,对该对象进行stringify是会报错。
该对象的target对象指向了DOM节点,DOM节点本身有循环引用的情况,简单看下ownerDocument这个属性,指向的document对象
当第一个log为offlinelog时,_log_list会被清空之后执行_submit_log,函数在comboTimeout被重置前返回,导致comboTimeout永远为true,_submit_log不会再执行。
使用vue-cli构建的项目,vue产生的一些错误信息没有捕获到
设备:android QQ5.5~5.7
原因:下载进度事件会调用QzoneApp.fire()
解决办法:没很好的办法,在window上挂一个空的QzoneApp
window.QzoneApp = {
fire: function() {}
}
有一个问题,对于日志去重的处理:
1.repeat参数貌似对离线日志不生效,离线日志会存入重复的日志信息,上报离线日志的时候貌似也没有去重,感觉这样会导致重复上传大量相同错误日志;
2.repeat参数去重是通过一个全局对象_log_map实现的,如果刷新页面,则会重新new 一个_log_map对象,刚才已经达到重复上线的话,刷新之后又会进行上报。
建议:以上两个问题感觉可以统一处理,上报info的时候即实时上报的时候也会存入离线日志,存入时去重存储,根据indexdb里面的是否有该类型的错误进行选择上报,有且数量已达上线,就不在上报
跨域情况下unhandledrejection监听不到报错,只能通过catch方法或包裹try-catch,对promise构造函数本身如何包裹try-catch呢
腾讯云弄了个badjs-report镜像,可以用作小程序么
看介绍说是用 window.error
?不知道支不支持小程序
tryJs方式捕获到错误的逻辑会重复执行一次,可能导致业务逻辑异常,如重复发起请求等
建议去掉bj-wrap.js模块cat函数的重复try catch逻辑
我发现 bj-report 在上报的时候,有循环引用的错误。
value = JSON.stringify(value);
http://stackoverflow.com/questions/22806305/window-onerror-and-object-event
网站最近切https, badjs部署的如果是http请求无法发出
需要
BJ_REPORT.tryJs().spyCustom((customFunction)
有时候需要吧customFunction的静态属性也复制一下,不然会影响原始customFunction的使用
script Error 是什么?
是外部加载的JS 抛出异常的时候, 出于安全方面的考虑,js错误信息中可能包含一些敏感信息,比如用户名、权限提示等,希望能够把这类信息屏蔽。目前跨域的场景下会触发这种安全限制,window.onerror无法获得具体出错信息,而只能得到Script error 0 0
http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#runtime-script-errors
目前业内有以下两种方式:
1.1 Access-Control-Allow-Origin 回包header里设置允许cros的域
1.2 script 标签增加 crossorigin="anonymous"
当1和2同时满足就拥有了打开script errors的钥匙,window.onerror就能获得详细出错信息了
哪些浏览器能打开muted errors?
ie 6-10 没有同源限制的问题
Chrome 和 Firefox支持,Safari 不支持,
所以跨域的js想在Safari下获取出错详情信息,只能用try-catch了,onerror是无能为力了。
由于值不能设置多值,而且设置 * , 允许任何域名使用是一个很不安全的设置,所以一般会根据 浏览器请求头 refer 或则 orgin ,判断是不是白名单内的域名,是的就响应回对应的域名或则* (响应头不支持返回 *.qq.com),。当然如果cdn只对一个业务服务也可以写死域名
1.anonymous(默认)
不能带cookie
副作用,当 AC 的设置不是 * 或者不等于origin时,js直接不加载
2.use-credentials
能带上cookie
副作用,当AC的设置不等于origin时,js直接不加载(不支持 *通配符了)
对于基于AMD和jQuery的网站,几乎所有业务函数都是通过回调异步触发的,所以我们只需要将所有异步函数包裹起来就可以捕获到大部分错误:
只针对 w3c 现代的浏览器的进行包裹,ie 不进行包裹 #2
没有个dom 都有这两个方法,我们没有办法对全部重写。但是我们发现目前基本都会使用 jquery 或 zepto ,所以我们对
跟上面的类似,我们不能重写 ajax ,但是前端开发都使用 jquery ,所以我们重写了 $.ajax
目前前端开发基本都使用了模块化管理,所以模块化的入口是非常好的入口。我们也进行了包裹
搭建好之后,上报出现Cannot GET /badjs
RT
单页面应用的情况下, init的 location.href 一般都不会是 发生错误时的 location.href.
所以获取 location.href的动作时, 应该是和获取错误 msg 在同一时间
为什么要有 offlineLog?
badjs 本身已经支持 info 级别用于记录用户操作日志。但是腾讯许多业务PV 往往很高,频繁的上报info 级别日志,不仅浪费用户流量,而且也浪费存储。
所以badjs-report1.3 提供了存储在用户本地的日志,而且在离线状态下也可以用。
什么时候用 offlineLog?
所以我们建议每个小时高于500左右的上报量,我们可以建议采用offlineLog ,而且我们推荐你使用 offlienLog 详细记录用户的操作日志,便于后面排查问题
offlineLog 原理是什么?
offloneLog 使用浏览器的 indexdb 进行存储日志的,badjs-report 的所有上报都会记录到离线日志中。而且有效期默认是最近5天,所以用户不用担心用户本地的日志过多。
怎么使用?
版本:最新的 1.3.1
浏览器:Linux Chrome
调用:
head 里:
BJ_REPORT.init({ id: 4, url: "******/badjs", ignore: [/Script error/i], repeat: 20 });
body 里:
BJ_REPORT.tryJs().spyAll();
页面里用了 jquery 和 seajs ,spyAll 是在最后调用的。页面只要 resize 就会抛出如下异常:
[BJ-REPORT] TypeError: foo.apply is not a function
at http://******/lib/badjs-report/1.3.1/bj-report-tryjs.js:604:28
查看源代码后发现是这一段:
var cat = function(foo, args) {
return function() {
try {
return foo.apply(this, args || arguments);
} catch (error) {
_onthrow(error);
//some browser throw error (chrome) , can not find error where it throw, so print it on console;
if (error.stack && console && console.error) {
console.error("[BJ-REPORT]", error.stack);
}
// hang up browser and throw , but it should trigger onerror , so rewrite onerror then recover it
if (!timeoutkey) {
var orgOnerror = global.onerror;
global.onerror = function() {};
timeoutkey = setTimeout(function() {
global.onerror = orgOnerror;
timeoutkey = null;
}, 50);
}
throw error;
}
};
};
调试后发现 foo 为整数 1000 ,args 为整数 0 。
拷贝下载的bj-report.js到工程,随后使用如下方法进行初始化
BJ_REPORT.init({
id: 5, // 上报 id, 不指定 id 将不上报
uin: 1233434, // 指定用户 id, (默认已经读取 qq uin)
delay: 1000, // 当 combo 为 true 可用,延迟多少毫秒,合并缓冲区中的上报(默认)
url: "//**域名**/badjs", // 指定上报地址
// ignore: [/Script error/i], // 忽略某个错误
random: 1, // 抽样上报,1~0 之间数值,1为100%上报(默认 1)
// repeat: 5, // 重复上报次数(对于同一个错误超过多少次不上报)
// 避免出现单个用户同一错误上报过多的情况
// onReport: function(id, errObj){}, // 当上报的时候回调。 id: 上报的 id, errObj: 错误的对象
// submit, // 覆盖原来的上报方式,可以自行修改为 post 上报等
ext: {}, // 扩展属性,后端做扩展处理属性。例如:存在 msid 就会分发到 monitor,
offlineLog : false, // 是否启离线日志 [默认 true]
offlineLogExp : 5 // 离线有效时间,默认最近5天
});
可以看到 http://域名/badjs 接口进行正常的上报,而接口 http://域名/offlineAuto 则报错,浏览器显示状态为404,查看服务器日志返回为403.
登录监控系统可以查看统计面板中的数据,历史日志和实时日志面板中均没有正常返回日志记录。
请问出现这些问题的原因是什么?
rtx
Without a license, this project isn't open source and no one can use the code.
Please use something like http://choosealicense.com/ to decide what license to use. I recommend MIT or GPL.
A novel effort by Add a License Please
是否考虑增加返回 onReport中的 errObj
目前前端使用webpack构建的很多, rollup也有一些, 这些是怎么做切面探测的?我看代码里没有关于这部分的处理
如果返回一个json格式,会提示格式错误,不返回的话又报404,虽然不影响功能,但是是否避免这些报错信息?
建议使用 unhandledrejection 来捕获未处理的 promise reject,从 chrome 49 开始已经支持,window.addEventListener('unhandledrejection', e => {console.log(e)});
Error object on ios has no msg property, by fixing the error msg report on ios, finding an error on iphones becomes easier.
全局异常监控的时候,会一直提示并在控制台输出 [BJ-REPORT] TypeError: Cannot read property 'apply' of undefined,请问这是为什么?
{"code":"ECONNRESET","errno":"ECONNRESET","syscall":"read"}
nodejs 控制台的错误:
Error: read ECONNRESET
at _errnoException (util.js:1024:11)
at TCP.onread (net.js:615:25) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' }
rtx
是的 packjson.json version 版本没有改?
用1.2.3 版本,BJ_REPORT 对象只有以下方法
debug: function (e){}
info: function (e){}
init: function (e){}
push: function (e){}
report: function (e){}
tryJs: function (e){}
没和离线日志有关的方法。
这个是localstorage 容量的超过了浏览器的限制。
不同浏览器的有不同的限制,主流的浏览器是5M,但是 ios 下的 safari 是 2M。
在angularJs的controller里写了一个错误,
$scope.TestReport =function () {
aaaa
}
但是捕获不到aaaa未定义的错误
腾讯的大佬好,请问这个js,能够捕获MVVM框架的前端异常吗?比如VUE等。
BJ_REPORT.push方法中 最后也调用了_process_log,
这里是不是多余?bj-report.js里调用BJ_REPORT.push(xx)的地方,很多地方都会再次调用_process_log的
因为BJ_REPORT.push是被设计成推入日志缓存池_log_list即可,不用在方法末尾在调用一次_process_log吧?
使用腾讯云的服务镜像部署的服务,全都使用的默认,现在实时的能收到数据,历史记录和离线都收不到数据
import badjs from 'badjs-report';
badjs.init({...}).tryJs(); // 提示 tryJs 不是一个function
通过import方式不能使用tryJs,因为 bj-wrap.js 源码内并没有做相应的模块化处理。 而是简单的复制给 root.BJ_REPORT.tryJS
我执行:
lego install badjs-report --save
的时候总是提示:
install: badjs-report@stable exit: Object.keys called on non-object
不知道怎么解决
通过docker部署的,只能显示实时监控,历史日志不显示。。。。。
MongoDB里面的是数据库 badjs也没有插入进去日志。通过db.badjs.find()没有查到日志记录
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.