前端错误日志收集方案

前言

公司的项目上线出现问题后难以定位错误,研究过现存的错误监控方案,受限于特殊条件只能定制自己的错误收集方案。

基于以上背景我撸出来一个错误日志收集方案 - Ohbug。

欢迎各位大佬 star ~

监控错误

说起错误的捕获,首先想到的是 try catch ,通过 catch 捕获到错误后进一步做出处理

try {undefined.map(v => v);
} catch(e) {console.log(e); // TypeError: Cannot read property 'map' of undefined
}
复制代码

然而 try catch 对于异步产生的错误毫无感知

try {setTimeout(() => {undefined.map(v => v);}, 1000)
} catch(e) {console.log(e); // TypeError: Cannot read property 'map' of undefined
}
复制代码

并且在实际工作中我也不可能给所有代码加上 try catch,所以能否捕获全局的错误呢?

react componentDidCatch

React 16 提供了一个内置函数 componentDidCatch,使用它可以非常简单的获取到 react 下的错误信息

componentDidCatch(error, info) {     console.log(error, info);
}
复制代码

React 16 的异常/错误处理

vue errorHandler

指定组件的渲染和观察期间未捕获错误的处理函数。这个处理函数被调用时,可获取错误信息和 Vue 实例。

Vue.config.errorHandler = function (err, vm, info) {// handle error// `info` 是 Vue 特定的错误信息,比如错误所在的生命周期钩子// 只在 2.2.0+ 可用
}
复制代码

errorHandler

onerror vs addEventListener

对于没有使用 react 或 vue 的项目可以通过 onerroraddEventListener 监控全局错误(当然使用 react 或 vue 的项目同样可以)

onerroraddEventListener 都可以捕获到一些未知的错误,然而这两个有什么区别呢?

window.onerror = (msg, url, row, col, error) => {console.log({msg, url, row, col, error});
};
setTimeout(() => {undefined.map(v => v);
}, 1000);
复制代码

window.addEventListener('error', (e) => {console.log(e);
}, true);
复制代码

除此之外,addEventListener 还可以捕获资源加载错误、未 catch 的 promise 错误。

// 捕获未 catch 的 promise 错误
window.addEventListener("unhandledrejection", e => {e.preventDefault();console.log(e);
});
Promise.reject('promiseError');
复制代码

ajax/fetch 错误监控

想要监控请求失败,上面的方法肯定是不可取的了。

使用 axios 的小伙伴可以通过配置拦截器实现错误的监控。

// 添加请求拦截器
axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);});// 添加响应拦截器
axios.interceptors.response.use(function (response) {// 对响应数据做点什么return response;}, function (error) {// 对响应错误做点什么return Promise.reject(error);});
复制代码

这里我采用了重新封装 XMLHttpRequest/fetch 对象的方法实现对网络请求的监控。

XMLHttpRequest

const AJAX = {// 记录请求的 urlreqUrl: '',// 记录请求的方法reqMethod: '',// 保存原生的 open 方法xhrOpen: window.XMLHttpRequest.prototype.open,// 保存原生的 send 方法xhrSend: window.XMLHttpRequest.prototype.send,init() {const that = this;window.XMLHttpRequest.prototype.open = function () {that.reqUrl = arguments[1];that.reqMethod = arguments[0];that.xhrOpen.apply(this, arguments);};window.XMLHttpRequest.prototype.send = function () {this.addEventListener('readystatechange', function () {if (this.readyState === 4) {if (!this.status || this.status >= 400) {// 错误收集}}});that.xhrSend.apply(this, arguments);};},
};
AJAX.init();
复制代码

fetch

const FETCH = {backup: window.fetch,init() {window.fetch = function (url, conf) {return (FETCH.backup.apply(this, arguments).then((res) => {if (!res.status || res.status >= 400) {// 错误收集}return res;}));};},
};
FETCH.init();
复制代码

待实现功能

  1. 捕获websocket错误
  2. 设置采集率
  3. sourcemap定位压缩代码具体错误位置

参考文章

  • 前端代码异常监控实战
  • Js error 监控
  • 前端一站式异常捕获方案(全)

转载于:https://juejin.im/post/5bd2dbc7f265da0af16183f8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring入门到放弃——spring事务管理

Spring事务提供了两种管理的的方式:编程式事务和声明式事务 简单回顾下事务: 事务:逻辑上的一组操作,组成操作的各个单元,要么全部成功,要么全部失败。 事务特性: 原子性:一个事务包…

高德百度地图如何获取附近小区酒店银行等?

概述 实现以下功能:根据当前定位,查找附近小区 实现步骤 高德,百度地图实现方式相同,步骤都是如下: 1.获取当前位置的经纬度 2.查询poitype编码。 (小区,写字楼,银行&#xff0…

angular 字符串转换成数字_Python基础语法大全:字符串的处理与使用

本文来自牛鹭学院学员:邓瑞杰字母处理string.capitalize()返回元字符串,且将字符串第一个字母转为大写,其它字母小写string.title()返回元字符串,且将字符串第一个字母转为大写,其它字母小写string.swapcase()用于对字…

Java实现MD5编码32位

加入依赖包 <dependency><groupId>org.apache.directory.studio</groupId><artifactId>org.apache.commons.codec</artifactId><version>1.8</version></dependency> 实现代码 DigestUtils.md5Hex(字符串)

计算机二级考试python_全国计算机等级考试考试大纲(2018年版)

级别 大纲名称 一级 一级计算机基础及WPS Office应用考试大纲&#xff08;2018年版&#xff09;点击下载 一级计算机基础及MS Office应用考试大纲&#xff08;2018年版&#xff09;点击下载 一级计算机基础及Photoshop应用考试大纲&#xff08;2018年版&#xff09;点击下载 一…

人工智能的就业方向

关于AI在的就业方向主要有&#xff0c;科研机构(机器人研究所等)&#xff0c;软硬件开发人员&#xff0c;高校讲师等&#xff0c;在国内的话就业前景是比较好的&#xff0c;国内产业升级&#xff0c;IT行业的转型工业和机器人和智能机器人以及可穿戴设备的研发将来都是强烈的热…

1亿像素的真相

世界那么大&#xff0c;谢谢你来看我&#xff01;&#xff01;关注我你就是个网络、电脑、手机小达人 乔布斯曾说&#xff0c;“手机拍照上主打高像素&#xff0c;是手机厂商利用广大消费者对照片成像原理知识漏洞的表现。” 小米发布了一款有1亿像素的概念型手机&#xff0c…

python实现链表的删除_Python中 为我们提供了一些独特的解决方案的方法特性

实际上&#xff0c;在日常的工作中&#xff0c;我们很多需求&#xff0c;无论是常见的、还是不常见的&#xff0c;Python 都为我们提供了一些独特的解决方案&#xff0c;既不需要自己造轮子&#xff0c;也不需要引入新的依赖(引入新的依赖势必会增加项目的复杂度)。但是 Python…

打通C/4HANA和S/4HANA的一个原型开发:智能服务创新案例

2019独角兽企业重金招聘Python工程师标准>>> 今年6月SAP发布C/4HANA之后&#xff0c;有顾问朋友们在公众号后台留言&#xff0c;询问C/4HANA如何同SAP的数字化核心S/4HANA系统结合起来&#xff0c;从而打通企业的前后端业务&#xff0c;帮助企业实现数字化转型。 有…

爬虫的重要思想

1.理论上讲只要网页上面能够看到的数据都是可以爬取的&#xff0c;因为所有看到的网页上的数据都是服务器发送到我们电脑上面的&#xff0c;只是有的数据加密过&#xff0c;很难解密。 2.在网页上无法看到或者无法获取的数据&#xff0c;爬虫同样不可能拿到&#xff0c;比如一…

python web环境傻瓜搭建_python——web 环境搭建

1.安装引用第三方库 selenium pip install selenium 2.下载浏览器驱动&#xff08;驱动版本和浏览器版本要对应参考链接 http://npm.taobao.org/mirrors/chromedriver/&#xff09; 查看浏览器驱动对应关系&#xff0c;本次已最新驱动版本作为教材讲解 版本2.42 发布时间2018.9…

项目管理十大知识领域,为何不含

问&#xff1a;项目管理十大知识领域&#xff0c;为何不含以下几项&#xff1a;立项管理&#xff0c;合同管理&#xff0c;文档管理&#xff0c;变更管理&#xff1f; 答&#xff1a; 立项完了才有项目&#xff1b; 合同管理包含在采购管理&#xff1b; 变更管理在整体管理&am…

B站视频下载(VideoHelper)

继续上次的知乎爬虫&#xff0c; 这次开始了哔哩哔哩的爬虫实践&#xff1b; 首先介绍下如何下载吧&#xff1a; VideoHelper 里面有三种方式下载b站视频。 同样的流程&#xff0c; 还是先抓包&#xff0c;分析参数&#xff0c;寻找参数&#xff08;包括之前的请求包和页面源码…

在职场遇到一个总是说话带刺的同事怎么相处?

网友&#xff1a; 带刺的人如果总是扑空&#xff0c;或者总是戳进一团棉花&#xff0c;你说他&#xff0c;她还能坚持多久。职场重心是工作&#xff0c;是做事&#xff0c;不要为这些无聊的人事太费心&#xff0c;刺猬带着刺到处转&#xff0c;最后结果不会好的。 网友&#xf…

postgresql 怎么读_大数据采集和抽取怎么做?这篇文章终于说明白了!

本文来源于公众号【胖滚猪学编程】&#xff0c;转载请注明出处&#xff01; 关于数据中台的概念和架构&#xff0c;我们在大白话 六问数据中台和数据中台全景架构及模块解析&#xff01;一文入门中台架构师&#xff01;两篇文章中都说明白了。从这一篇文章开始分享中台落地实战…

ZooKeeper应用——解决分布式系统单点故障

1.单点故障问题什么是分布式系统中的单点故障&#xff1a;通常分布式系统采用主从模式&#xff0c;就是一个主控机连接多个处理节点。主节点负责分发任务&#xff0c;从节点负责处理任务&#xff0c;当我们的主节点发生故障时&#xff0c;那么整个系统就都瘫痪了&#xff0c;那…

老板思维:有支出必须有对应的收入

项目经理 要时刻关注“有支出必须有对应的收入”。 当手头的项目产生支出时&#xff0c;必须要问自己&#xff0c;从哪里收入来填补这个支出&#xff0c;如果没有可收入的&#xff0c;那就是公司亏钱了。如果一定要亏钱&#xff0c;那可否产生收入之外的效益。 甲方提了新需求…

生活之难:生活到底难在哪里

生活之难&#xff1a;生活到底难在哪里 一、总结 一句话总结&#xff1a;难在天性&#xff0c;难在竞争&#xff0c;难在积累&#xff0c;难在追求&#xff0c;难在自己 难在天性 人的天性就是好吃懒做好玩不动脑的&#xff0c;但是生存的压力&#xff08;食物&#xff0c;房子…

解决org.springframework.web.multipart.MaxUploadSizeExceededException报错问题

在springboot中接收到上传的文件时候&#xff0c;出现了这种错误 org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.Fil…

python中元祖 字典 列表的区别_Python中元祖,列表,字典的区别

原博文 2016-08-16 15:25 − Python中有3种內建的数据结构&#xff1a;列表、元祖和字典&#xff1a; 1.列表 list是处理一组有序项目的数据结构&#xff0c;即你可以在一个列表中存储一个序列的项目。 列表中的项目应该包括在方括号中&#xff0c;这样Python就知道你是指明一个…