前端错误日志监控——Sentry使用教程

感谢

感谢计蒜客俞总提出的宝贵的意见
感谢Vue Land聊天室中Andreas大神的支持

前言

在项目中,我们使用Vue来做前端部分的开发。Vue是一套非常领先的渐进式前端框架,配合Webpack可以做到非常好的前端工程化设计。在写到测试环节时,我们发现由于我们的前端部分主要承担显示的任务,不涉及过多的逻辑处理,因此传统的单元测试其实并没有什么太大的价值。经过研究发现Webpack里主要集成了两种测试方法,一种是Unit test,另一种是e2e test。前者主要测试逻辑实现,后者主要测试界面显示。但是其实在我们的项目中,这些都不是很重要。于是我们选择放弃测试部分,选用Sentry进行错误日志的捕捉。这样在前端运行发生错误的时候,我们可以及时获取到错误并进行分析。

注册

首先打开网站Sentry,点击页面上的“Start using Sentry”按钮进入注册页面。

注册页面

在注册页面中填入相应的个人信息即可完成注册。注册之后可以进入官方的引导页面,之后按照引导流程就可以完成注册。Sentry官方默认有个人套餐可以免费捕捉10k次错误信息。当需要团队协作的时候可能需要购买付费套餐,在本文中不做团队协作的演示,具体参见官方流程即可。

需要说明的是,Sentry服务是可以配置在你个人的服务器上的,具体配置请自行搜索教程,本文仅针对使用默认配置在Sentry.io上的服务进行讲解。

配置教程

初步配置

在Vue 2.x中,Vue官方加入了errorHandler用来捕捉产生的错误并进行处理。Sentry的Vue集成便使用了这种方式进行官方集成(官方文档)。这里针对Webpack的配置进行讲解。
首先使用npm安装相关包。

npm install raven-js --save

然后在你编写页面的app.js(或者其他名称的主js文件)中加入以下代码。

import Vue from 'vue';
import Raven from 'raven-js';
import RavenVue from 'raven-js/plugins/vue';

Raven
    .config('your DSN')
    .addPlugin(RavenVue, Vue)
    .install();

这里的DSN指的是Sentry为每个项目配置的用来接入服务的链接,有些类似于git服务。每个DSN由以下六个部分组成:

{PROTOCOL}://{PUBLIC_KEY}:{SECRET_KEY}@{HOST}/{PATH}{PROJECT_ID}

当然我们不需要仔细寻找每个部分都是什么。在官方的配置页面中已经给出了你的项目应该使用的DSN地址。在“你的项目”右上角进入“项目设置”,点击左侧的客户端密钥(DSN)即可显示当前项目使用的DSN地址。我们在代码中加入的DSN就是图中第二行“DSN(Public)”中的地址。当然如果你觉得一个密钥不够的话可以通过右上角生成多个密钥。

DSN密钥

然后运行npm run build并将dist文件夹放在服务器上就可以捕获错误了。捕捉到的错误如下所示。其中会包含用户的IP信息,浏览器信息和系统信息,方便进行错误的复现。同时会展示错误所在的具体行数,方便定位错误。

错误信息

这里有两个需要注意的事情:

  1. 上面对于Sentry的配置代码需要放在Vue配置之前。
  2. 当你使用npm run dev运行时,Vue会主动捕获所有的错误并将其输出到控制台,这使得调试错误十分方便,但也使得Sentry无法捕获到错误。

Source Map使用

当你成功使用上述方式配置并捕获到错误是,你会发现你所捕获到的错误代码根本看不懂。这是因为在默认的Webpack配置中对于打包出来的代码进行了丑化处理以及Babel转义,从而使得代码看上去并不直观。这样的错误信息显然对于我们理解错误原因没有任何作用。这里就要使用Sentry提供的source map服务将压缩过后的js代码转化为原有的js代码从而更有效的进行错误处理。

Webpack有着非常多的source map模式,我们使用在生产环境下默认的“source-map”模式。我们可以发现在dist/static/js文件夹中每一个js文件都有着相对应的map文件。我们需要做的就是将这些map文件上传并将其与服务器上的js文件进行对应从而还原出原有的js文件。

官方推荐使用上传文件的方式来使得Sentry可以获取到map文件(官方文档)。在下面我们介绍Webpack下如何进行配置

Sentry Cli

首先安装Sentry Cli。这里我们可以安装在全局,也可以安装在项目里。

npm install sentry-cli-binary -g

然后我们需要通过官方获取一个token用来登录。点击页面左下角头像-API进入token获取页面。点击右下角按钮生成新的token。


获取token界面

生成token的时候要记得把project:write勾选,其余采用默认配置即可

然后我们通过命令行登录,输入刚才生成的token即可。

sentry-cli login

然后我们需要对项目创建一个release。

sentry-cli releases -o <your organization> -p <your project> new <release version>

然后就可以通过sentry-cli上传map文件了。

sentry-cli releases -o <your organization> -p <your project> files <release version> \
upload-sourcemaps --url-prefix <your domain assets url> <local assets directory>

其中<your domain assets url>指的是js文件在你服务器上可以访问到的位置前缀,<local assets directory>指的是js文件在你本地文件夹的位置。这个位置不必特别精确,sentry-cli可以自行寻找相应的文件并上传。

与此同时,你需要将Raven的配置做一些更改,否则将会出现一些识别问题。

import Vue from 'vue';
import Raven from 'raven-js';
import RavenVue from 'raven-js/plugins/vue';

Raven
    .config('your DSN', {release: 'release version'})
    .addPlugin(RavenVue, Vue)
    .install();

这样你就可以在Sentry捕获到错误的时候查看压缩前的代码了。

注意:

  1. 由于Sentry服务是依赖release版本号区分map文件的,因此需要确保版本号对应。版本号可以是“1.0.0”这样的常规版本号,也可以是一个哈希串的一部分。
  2. 你在网页上填写的项目名称可能含有大写字母,但是上面的参数必须是小写字母。具体应该填什么可以参考你的项目网页URL部分。

Sentry Webpack Plugin

Sentry官方同样提供了Webpack插件可以实现在npm run build的时候自行上传相应的文件,避免每次都需要输入sentry-cli的麻烦。
首先通过命令行安装Sentry Webpack Plugin。

npm install @sentry/webpack-plugin

然后在你的webpack.prod.conf.js中将此插件加入plugins数组即可。具体配置方法可以参考这里。为此我们可能需要编写一个名为.sentryclirc的文件来配置该工具,记得在.gitignore中加入这个文件,因为该文件中会包含你的项目的token,该文件的语法规则查看这里

结尾

本文仅提供Sentry服务的入门教程,想要更深入地了解可以进入官方网站文档页面查看更加细致的完整文档。Sentry同样可以适用于后端的信息监控,其能力还是非常强大的。

配置上有什么问题可以在评论区留言。同为前端新手,共同学习,共同进步。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容

  • 每一分钟,都有人在故事里看到自己。 周末。电影。 《从你的全世界路过》,看的过程哭了好几次。这本书14年的时候就看...
    31fe5e77730f阅读 171评论 0 0
  • 因为她从未回头 所以那个背影才够完美 这也是我执着于拒绝你的原因 不要再说什么失望、伤心的傻话啦 我不配! 从我爱...
    李初音阅读 186评论 0 0