sentry前端报错日志系统

新时代的前端系统上线之后,通常会遇到以下几个问题前端报错,用户使用功能异常,没有通知开发人员的渠道
了解到报错后,因为前端做代码混淆和压缩,删除 source map,没有办法准确定位错误位置不清楚用户的操作系统、浏览器、请求内容和存储等信息,无法进行问题复现

上述问题目前有统一的解决方案,就是使用 web bug 埋点追踪系统,目前开源免费好用的系统,就是今天要介绍的 sentry
sentry 的特性

在使用上,sentry 既可以直接在其网站https://sentry.io/中查看 bug 追踪信息,也支持企业进行内部搭建

在功能上,sentry 支持发送错误通知给出客户端相关信息,包括浏览器版本、操作系统和请求内容等代码版本(release 版本号)上传代码源文件(source map)

如何使用 sentry

下面将以一个 React 项目为例,讲解如何使用 sentry

1、注册账号并创建项目

访问 sentry 的官网:https://sentry.io/

注册的时候会创建组织,注册完成后新建项目,选择 React 创建即可

image

创建后会有一个官方指导,该如何使用代码

image

按照步骤操作即可,其中要注意 dsn 的添加,这个是每个项目特有的,不要放错

其中默认界面是英文的,并且时区不是中国的时区,会有 8 个小时的时差,建议更改过来,更改位置在用户设置的具体项目设置中

image
image

2、前端启动

首先安装 sentry 的浏览器包

$ yarn add @sentry/browser

然后初始化项目并且抛出一个错误


importReactfrom'react';

importReactDOMfrom'react-dom';

import*asSentryfrom'@sentry/browser';

importAppfrom'./App';

Sentry.init({dsn:"your dsn"});

ReactDOM.render(, document.getElementById('root'));

然后在 App 中加入了一个 button,并且点击后会出现错误代码,导致程序报错

<button
  onClick={() => {
    const a = {}

    // 此处同样会报错
    console.log(a.name.name)

    // 抛出错误
    new Error('抛出错误')
  }}
>
  throw error
</button>

此时启动该项目,然后点击 button,查看 console 就可以发现出现了报错

image
image

此时查看 chrome 的 network,就会发现 sentry 已经发了一个请求出去,通知我们的系统了

image

然后再去我们的系统查看,在问题导航处就会发现一个新的 issue

image

打开后可以看到详细信息,其中会发现并不能准确的找到源代码的错误位置,只是会有整个错误的路径和出错人的操作系统,浏览器信息等

image

如果连续触发几次这个错误,会发现只要是同一个错误,错误条数并不会增加,只是在事件和用户数量上做增加

image

3、设置发布项目的 release 版本号

上文提到目前为止并没有办法判断用户错误出现的具体的源代码位置,原因就是 source map 没有上传 sentry

而设置 release 版本号本质是为了后续的 source map 上传做准备,用来区分不同版本的 source map,好进行报错的代码映射

通过下述方式指定 release

import*asSentryfrom'@sentry/browser'

Sentry.init({

release:'test004',

dsn:'https://<key>@sentry.io/<project>'

})

其中test004就是 release 版本号,如果此时点击 button 触发异常,查看 sentry 就会看到版本的位置出现了内容,在没有指定 release 版本号的时候这里显示的是n/a

image

4、source map 上传

只有在开发环境,我们才会使用 sourceMap,线上环境如果加载 sourceMap,不仅影响用户体验,而且也会暴露源代码。

下面讲一下上传 sourceMap 到 sentry 上的几种方式

sentry-cli 命令行上传

首先安装 sentry-cli

$ yarn global add sentry-cli

然后修改生成的~/.sentryclirc,必须将 org 和 project 补充上去

[auth]
token=<token>

[defaults]
url=https://sentry.io/
org=mdnice
project=test004

然后将应用进行打包,生成 build 目录,通过指令将目录中的.map 文件上传

$ sentry-cli releases files <release名称> upload-sourcemaps --url-prefix <线上资源URI> <打包出来的js文件所在目录>

$ sentry-cli releases files test004 upload-sourcemaps --url-prefix '~/static/js' './build/static/js'

成功后打开 sentry 控制台的版本即可看到上传的文件

image

此时再点击 button 触发异常,可以发现已经能够映射到具体的代码行位置了,这就是由于上传 source map 的原因

image

通过 webpack 插件(@sentry/webpack-plugin)上传

命令行的方式不够工程化,官方有 webpack 插件可以使用

首先安装下面两个包

$ yarn add @sentry/cli

$ yarn add @sentry/webpack-plugin

然后再 webpack.config.js 代码中配置如下代码

constSentryPlugin =require('@sentry/webpack-plugin');

newSentryPlugin({

release:'test004',

include:'./build',

urlPrefix:'~/',

ignore: ['node_modules','webpack.config.js'],

})

这样打包的时候即可直接上传 sentry,不用再执行单独的命令去做了

这个插件没有删除打包后文件.map 的配置项,如果要删除需要自行处理

5、sentry 的其他功能

如果上述基础功能不够用的话,还有一些其他高级功能

配置 beforeSend,可以弹出对话框,让用户进行更详细的信息反馈

Sentry.init({
  dsn: "your dsn",
  release: "test004",
  beforeSend(event, hint) {
    // Check if it is an exception, and if so, show the report dialog
    if (event.exception) {
      Sentry.showReportDialog({ eventId: event.event_id });
    }
    return event;
  },
});
image

还有可以自定义 bug 上下文信息

Sentry.setUser({"email": "xx@xx.cn"});
Sentry.setTag('api', 'api/list/get')
Sentry.setLevel('error');
Sentry.setExtra('data', {
  req: {a:1},
  res: {b:1},
  header:headers
})
Sentry.captureException(new Error('throw new api'))
image
image

总结

sentry 是个很优秀的 bug 追踪系统,为上线应用获取 bug 信息,隐藏 source map 有着极其重要的贡献,也欢迎大家使用

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