前端錯誤日志收集方案

前言

公司的項目上線出現問題后難以定位錯誤,研究過現存的錯誤監控方案,受限于特殊條件只能定制自己的錯誤收集方案。

基于以上背景我擼出來一個錯誤日志收集方案 - 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.pswp.cn/news/537615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537615.shtml
英文地址,請注明出處:http://en.pswp.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就知道你是指明一個…