捕获所有JavaScript错误并将其发送到服务器


232

我想知道是否有人在全局处理JavaScript错误并将其从客户端浏览器发送到服务器方面有经验。

我认为我的观点很明确,我想知道客户端发生的所有异常,错误,编译错误等,并将其发送到服务器以进行报告。

我主要使用MooTools和head.js(对于JS端)和Django作为服务器端。


20
我不明白为什么这个问题不清楚。
Michael Hilus,2015年

3
投票两次以重新提出问题,但没有任何运气。完全不清楚为什么这个问题如此不清楚。
穆罕默德·乌斯曼

7
@ andrew-barber-如果有太多用户认为这个问题足够相关,可以予以支持,那么也许您不清楚问题是否与您有关?
isapir 2015年

5
这个问题不仅清楚,而且被低估了:)
Teoman shipahi

Answers:


16

我最近在生产环境上测试了Sentry,它工作正常(JS和其他语言,如PHP)

1-它是开源的(您可以将其安装在自己的服务器上)2-您可以使用免费计划(每天100次报告)

或将其安装在您的服务器上:github.com/getsentry


请注意,他们为教育机构制定了无限的免费计划
christianvuerings

8
似乎不再是开源了,所有选项都已付清吗?
大卫坎普斯

4
@DavidCumps他们还提供免费的服务(试行),但你只能得到7天错误的历史或者你可以因为其开源(UR自己的服务器上安装它github.com/getsentry
塔里克

1
Google跟踪代码管理器具有Javascript错误监听器,也许值得一试,尤其是如果您已经在使用GA
Adrian Gunawan 2014年

您还应该为此检查TrackJS。这是一项付费服务​​,但是它提供了大量有关用户如何进入错误情况进行调试的上下文。我是开发人员,并且已经解决了许多错误:)
Todd Gardner

318

我会检出window.onerror

例:

window.onerror = function(message, url, lineNumber) {  
  //save error and send to server for example.
  return true;
};  

请记住,返回true将阻止默认处理程序的触发,返回false将使默认处理程序运行。


9
您最好先分配window.onerror,然后再运行其他任何东西。因此,无论您要放置在哪里,只要确保它在其他任何js代码/文件之前运行即可。
Mike Lewis

17
注意,Mozilla建议:“请注意,某些/许多错误事件不会触发window.onerror,您必须专门侦听它们。”
亚当·内洛

88
是的,我喜欢它说的一些/很多,非常具有描述性-谢谢Mozilla。
丹尼尔·门德尔

5
Mozilla暴露了GlobalEventHandlers.onerror:developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…–
roland

1
如果处理window.onerror本身的代码抛出错误,将会发生什么。有无限循环的可能吗?
马丁·布朗

15

如果您的网站使用的是Google Analytics(分析),则可以执行以下操作:

window.onerror = function(message, source, lineno, colno, error) {
  if (error) message = error.stack;
  ga('send', 'event', 'window.onerror', message, navigator.userAgent);
}

关于上面的代码的一些注释:

  • 对于现代浏览器,将记录完整的堆栈跟踪。
  • 对于不捕获堆栈跟踪信息的旧版浏览器,将记录错误消息。(以我的经验,大多数是iOS早期版本)。
  • 用户的浏览器版本也会被记录,因此您可以查看哪个OS /浏览器版本引发了哪些错误。这简化了错误优先级划分和测试。
  • 如果你使用谷歌分析“的analytics.js”,此代码的工作是这样。如果像这样使用“ gtag.js”,则需要调整函数的最后一行。有关详细信息,请参见此处

代码到位后,这就是查看用户的Javascript错误的方式:

  1. 在Google Analytics(分析)中,点击相应Behavior部分,然后点击Top Events报告。
  2. 您将获得事件类别列表。window.onerror在列表中单击。
  3. 您将看到Javascript堆栈跟踪和错误消息的列表。通过单击Secondary dimension按钮并Event Label在出现的文本框中输入,为用户的OS /浏览器版本添加一列。
  4. 该报告将如下图所示。
  5. 要将OS /浏览器字符串转换为更易于理解的描述,我将其复制粘贴到https://developers.whatismybrowser.com/useragents/parse/

在此处输入图片说明


3
尽管这是一件很酷的事情,而且我认为您不应该接受否决权,但这并不能捕获所有错误,而只能捕获尝试捕获的块。
尼克·斯蒂尔

谢谢你,尼克!我用经过战斗验证的代码更新了我的答案,该代码在我的网站上运行良好,并且捕获了所有错误,而不仅仅是捕获了try ... catch所捕获的错误。
Martin Omander '18

2

不要尝试使用第三方服务,而要自己尝试。

错误处理程序可以捕获以下情况,

  1. 未捕获的TypeError无法捕获
  2. 未捕获的ReferenceError无法捕获,例如:var.click()
  3. 可以捕获TypeError
  4. 可以捕获语法错误
  5. 可以捕获ReferenceError

要捕获Javascript错误:

window.addEventListener('error', function (e) {
  //It Will handle JS errors 
})

要捕获AngularJS错误:

app.config(function ($provide) {
$provide.decorator('$exceptionHandler', function ($delegate) {
   return function (exception, cause) {
       //It will handle AngualarJS errors
      }
   })
})


0

您可以尝试Atatus-它是针对现代Web应用程序的新JavaScript错误跟踪服务,以及Real User Monitoring(RUM)。

我们不仅捕获错误,还捕获引发错误的用户事件。这为您提供了最终重现错误的步骤。

除了捕获错误外,我们还捕获页面加载时间,并从不同的角度显示页面加载时间-地理位置,浏览器,页面下钻,页面直方图,Ajax监视和事务监视。

https://www.atatus.com/

可用文件:https//www.atatus.com/docs

免责声明:我是Atatus的一名Web开发人员。


1
我集成了Ataus,然后尝试了类似foo.bar =''的操作,这导致了异常。但是我在Atatus仪表板上看不到任何东西。
vmachacek

您能给我们发电子邮件吗?
Fizer Khan

5
无耻的插头。广告应限制在右侧。
威尔


-2

您可能想查看此新服务,http://rescuejs.com/https://bugsnag.com/

让您无需编写服务器端代码即可记录所有javascript错误。它还跟踪浏览器版本等。

我不确定我是否会认为他们100%“准备就绪”,但是绝对值得一试。


8
它已被关闭。如果您现在尝试注册,则会收到消息“谢谢您的关注,很遗憾,Rescue.js不再处于积极工作状态。”
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.