Vue2.x项目整合ExceptionLess监控

前言

一直以来我们都是用Sentry做项目监控,不过前段时间我们的Sentry坏掉了(我搞坏的)

但监控又是很有必要的,在sentry修好之前,我想先寻找一个临时的替代方案,同时发现网上关于ExceptionLess的资料少得可怜,ExceptionLess官方的文档也不是很完善,翻了好久文档和源码,于是有了本文……

关于ExceptionLess

写.NetCore的同学应该不会陌生,这个是.Net平台的一款监控工具,跟Sentry差不多,不过我们觉得界面比sentry清爽,信息也比较清晰一目了然,所以我们的.NetCore服务监控全都用ExceptionLess来做。

然后ExceptionLess也是支持前端的,因此,我打算先暂时用ExceptionLess来做我们的前端项目监控。

准备工作

在ExceptionLess中创建一个项目,这个懂的都懂,不重复了~

ExceptionLess提供了好几种模式,有Node.js、也有浏览器应用,这里我选的是浏览器应用。

官方还有关于Vue的例子,不过是vue3.x版本的,因为我们目前还在用vue2.x,所以只能自己基于浏览器应用的SDK封装一个来用~

安装ExceptionLess客户端

使用yarn安装客户端

yarn add exceptionless

我使用的版本是^1.6.4

集成ExceptionLess

src/utils下创建一个新的js文件:exceptionless.js

import {ExceptionlessClient} from 'exceptionless/dist/exceptionless';const exLessClient = ExceptionlessClient.default;
exLessClient.config.apiKey = '';
exLessClient.config.serverUrl = ''const install = Vue => {if (install.installed)returninstall.installed = trueObject.defineProperties(Vue.prototype, {$exLess: {get() {return exLessClient}}})
}export default install

这样实现了把ExceptionLess封装为一个Vue模块

然后编辑main.js,准备注册模块

import Exceptionless from './utils/exceptionless'
// Exceptionless模块
Vue.use(Exceptionless)

这样,在需要提交日志的地方就可以直接使用:

this.$exLess.submitLog('测试信息')
this.$exLess.submitException(error)

集成到全局异常处理

如果所有异常要自己手动捕获提交的话就太麻烦了,而且会有漏网之鱼

我参考了网上的资料,搞了个vue全局异常处理,把没有手动捕获的异常收集起来,然后一并提交到ExceptionLess平台。

直接上代码,src/utils/errorHandler.js

import {ExceptionlessClient} from 'exceptionless/dist/exceptionless';const exLessClient = ExceptionlessClient.default;function isPromise(ret) {return (ret && typeof ret.then === 'function' && typeof ret.catch === "function")
}const errorHandler = (error, vm, info) => {console.error('抛出全局异常', 'vm=', vm, 'info=', info)console.error(error)exLessClient.submitException(error)
}function registerActionHandle(actions) {Object.keys(actions).forEach(key => {let fn = actions[key]actions[key] = function (...args) {let ret = fn.apply(this, args)if (isPromise(ret)) {return ret.catch(errorHandler)} else { // 默认错误处理return ret}}})
}const registerVuex = (instance) => {if (instance.$options['store']) {let actions = instance.$options['store']['_actions'] || {}if (actions) {let tempActions = {}Object.keys(actions).forEach(key => {tempActions[key] = actions[key][0]})registerActionHandle(tempActions)}}
}
const registerVue = (instance) => {if (instance.$options.methods) {let actions = instance.$options.methods || {}if (actions) {registerActionHandle(actions)}}
}let GlobalError = {install: (Vue, options) => {/*** 全局异常处理* @param {*} error* @param {*} vm*/Vue.config.errorHandler = errorHandlerVue.mixin({beforeCreate() {registerVue(this)registerVuex(this)}})Vue.prototype.$throw = errorHandler}
}export default GlobalError

main.js中注册

import ErrorHandler from "./utils/errorHandler"// 全局异步处理模块
Vue.use(ErrorHandler)

搞定~

参考资料

  • 【实践总结】优雅的处理vue项目异常:https://juejin.cn/post/6844903860121632782

  • Vue3 对比 Vue2.x 差异性、注意点、整体梳理,与React hook比又如何:https://juejin.cn/post/6892295955844956167#heading-21

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

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

相关文章

Jenkins修改管理员密码.

前言:Jenkins修改管理员密码,我看了网上所有的教程,竟然全都是拿着一串已经加密好的111111的密文去替代config.xml文件里面的密码,然后大家的密码都是111111!我觉得这种做法实在太敷衍了!于是我就研究了下&…

截取指定字符前_VBA学习笔记35-1:字符串拆分与组合

学习资源:《Excel VBA从入门到进阶》第35集 by兰色幻想本课的示例都在立即窗口展示运行结果,要在立即窗口展示的话要使用“Debug.Print”。Debug.Print 将代码执行结果显示在“立即窗口”中,但不影响程序执行。一、字符串截取1.left,right,mi…

C++之inline函数

1、为什么需要inline C中的宏没有调用,参数压栈、返回操作所以比函数快,但是有参数副作用,inline为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。 2、inline如何使用以及特点 1)、inline一般写 在C++函数定义的前面,一般…

即时聊天IM之一 XMPP协议简述

合肥程序员群:49313181。 合肥实名程序员群:128131462 (不愿透露姓名和信息者勿加入) Q Q:408365330 E-Mail:egojitqq.com 综述: 之前小规模的IM一直通过百度云推实现模拟IM,这种局限性比较多。公司很多的项目都需要IM集成…

微软职位内部推荐-Senior PM

微软近期Open的职位:Senior Product ManagerMy Life & WorkBeijing ChinaOur passion is to enable people to thrive in this mobile-first and cloud-first world.Do you see how antiquated our surrounding is when the virtual world has already become more advance…

c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!

简介Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象。Clay和ExpandoObject相比,提供了更加灵活的语法支持,让我们像写javascript代码一样写C#代码&#xff0c…

Android之ndk编译出现“undefined reference to method“解决办法

1、问题 我自己写了C的头文件和实现的C文件,然后编译成csapp.so库,然后在jni里面写了Android.mk文件和Application.mk文件,配置确保已经没问题,然后csapp.so的位置和头文件都放对了,然后写了一个测试test.cpp文件,然后这个里面调用了csapp.so里面的方法,然后我 ndk-buil…

7 种 JavaScript 技巧使你更聪明

1.总是颠倒逻辑 让我们从一个小优化开始,目的是为了使得非常简单的操作看起来复杂些。 if (x && y) { … } // bad if (!(!x || !y)) { … } // good2.在你的变量名字里使用扩展的unicode字符 编译好的软件一旦发布成产品,它必须是一个黑盒。这对…

设置访问权限_【新思考教学者思】李世松:不要对经典设置访问权限

不要对经典设置访问权限——《背影》备课札记文/李世松紫阳县举办课堂教学改革推进会,师训教研中心王主任电话通知我讲一节示范课。我知道,这既是对我的一种肯定,更是一次磨炼,因为我的师父邱俊老师会到现场点评课堂。自领受任务之…

C++语言打印汉字表

#include<iostream> using namespace std; main() {int i,j;for(i=0xA1;i<=0xFE;i++){for(j=0xA1;j<=0xF7;j++)printf("%c%c",i,j); // 或者用cout输出函数:cout<<char(i)<<char(j);printf("\n");} } 说明: 16进制和10进制转换…

《算法竞赛入门经典》第三章 3.4

程序 3-5 程序 3-6 转载于:https://www.cnblogs.com/LzKlyhPorter/p/4192250.html

C#使用Objects Comparer进行对象比较

介绍Objects Comparer是用于对象比较的工具&#xff0c;c#常见的数据结构都是可以用这个三方库进行对比&#xff0c;比较复杂的对象也是可以比较的。简而言之&#xff0c;Objects Comparer 是一个对象到对象的比较器&#xff0c;它允许逐个成员递归得比较对象&#xff0c;并为某…

jQuery07源码 (3803 , 4299) attr() prop() val() addClass()等 : 对元素属性的操作

var nodeHook, boolHook,rclass /[\t\r\n\f]/g,rreturn /\r/g,rfocusable /^(?:input|select|textarea|button)$/i;jQuery.fn.extend({attr: function( name, value ) { //遍历this //arguments.length > 1,jQuery.attr(this[i],name,value),返回this //arguments.lengt…

Eclipse提示The **** cannot be resolved. It is indirectly referenced from required .cl

1、问题 代码正常&#xff0c;提示这个错误The **** cannot be resolved. It is indirectly referenced from required .cl 2、解决办法 把提示错误地方的类改成在这个****包名下面就行

ora22813操作数值超出系统的限制_最新:华为“鸿蒙”操作系统终于面世!一旦遭到限制,将随时启用...

受美国的要求&#xff0c;自5月开始&#xff0c;安卓暂停了与华为的部分合作&#xff0c;而这直接影响到了华为对安卓系统的正常更新。迫于无奈之下&#xff0c;华为对外表示&#xff0c;已经准备了备用系统&#xff0c;但只在必要的情况下使用&#xff0c;而这一系统就是广为人…

解决点击MDI父窗体下拉菜单,子窗体重复出现的问题

private void 培训信息TToolStripMenuItem_Click(object sender, EventArgs e) { foreach (Form form in Application.OpenForms) { if (form.Name "Zhuce_Train")//子窗体的Name属性 { …

cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法

问题描写叙述: 这段时间机器总是出现一个奇怪的问题:cidaemon.exe进程占用CUP率98%以上,大大影响了电脑的正常使用.资源管理器中出现多个cidaemon.exe进程,强制结束占用cpu率最高的一个,两分钟左右后,相同的问题还是出现了。 问题关联: cidaemon.exe相关知识&#xff1a;cidaem…

Blazor University (2)布局 — 创建 Blazor 布局

原文链接&#xff1a;https://blazor-university.com/layouts/布局Blazor 布局类似于 ASP Webforms 母版页的概念&#xff0c;与 ASP MVC 中的 Razor 布局相同。几乎网络上的每个网站都有一个模板用于整个网站&#xff08;页面顶部的品牌&#xff0c;底部的版权&#xff09;或网…

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序 一、plist文件和项目结构图 说明&#xff1a;这是一个嵌套模型的示例 二、代码示例&#xff1a; YYcarsgroup.h文件代码&#xff1a; 1 //2 // YYcarsgroup.h3 // 07-汽车展示&#xff08;高级&#xff09;4 //5 //…

递归和非递归实现规律函数

1、问题 A(n) n / (2 * n 1)B1 2 A1;B2 2 A1 * (2 A2);B3 2 A1 * (2 A2 * (2 A3));....以此类推&#xff0c;求B(n)2、代码实现 #include <stdio.h>/** A(n) n / (2 * n 1) B1 2 A1; B2 2 A1 * (2 A2); B3 2 A1 * (2 A2 * (2 A3)); ....以此类推&…