在服务器上记录客户端JavaScript错误[关闭]


97

我正在运行一个ASP.NET站点,在该站点中,我只能通过手动测试来查找一些JavaScript错误。

是否有可能在客户端捕获所有JavaScript错误,并将其记录在服务器上(即通过Webservice或类似方式记录在EventLog中)?


我们之所以不使用JavaScript UnitTesting的问题是,有太多的人在为网站/内容做贡献,而他们正在使用JavaScript。内容不是我们(作为开发人员)应该关心的,但是代码中有错误。因此,一般的解决方案会更好。
MADMap

我假设您不是说普通用户贡献了(否则就是XSS漏洞)...但是...您可能会在try / catch中将他们的JS隔离开来,这样至少不会影响您自己的JS ...而不知道动态的网站,我不知道这是否有帮助...
Mike Stone

内容来自公司中的其他团队,而不是来自用户,因此这不是安全风险
MADMap

Bugsnag将自动记录您的错误并在仪表板上显示它们。适用于.NET和JS。
Don P

Answers:


68

您可以尝试为onerror事件设置自己的处理程序,并使用XMLHttpRequest告诉服务器出了什么问题,但是由于它不是任何规范的一部分,因此支持有些不稳定

这是使用XMLHttpRequest记录JavaScript错误的示例:

window.onerror = function(msg, url, line)
{
  var req = new XMLHttpRequest();
  var params = "msg=" + encodeURIComponent(msg) + '&url=' + encodeURIComponent(url) + "&line=" + line;
  req.open("POST", "/scripts/logerror.php");
  req.send(params);
};


2
如果在处理程序中崩溃,它将无限循环吗?
Jean-Philippe Leclerc

2
@ Jean-PhilippeLeclerc是的。更糟糕的是,如果您陷入错误循环,它将对您的服务器终结点进行DoS。您应该为此添加限制功能,以防止客户端攻击服务器的速度过快。这是一个来自{Track:js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo / ...的示例
Todd Gardner

您还可以加密一个令牌,该令牌包括用户的ID,IP,一个小的随机字符串(如果您的加密算法快速但较弱,则可以阻止已知明文攻击),以及一个时间戳,并将其作为JS变量包含在页面中。然后可以将其与错误报告一起提交并进行检查,然后再将其附加到日志中。这有助于证明可能的错误消息的真实性,并保护其免受愚蠢的DoS攻击,但仍无法保护您免受更复杂的DoS尝试的制约。
mormegil 2014年

这件事会使您的服务器不知所措,例如,如果您发现setInterval方法错误。网络上有许多JS错误报告服务。结帐ErrLytics。它还为您提供网站上每个用户操作的分析。
Vivek Marakana'5

28

简短的回答:是的,有可能。

更长的答案:人们已经写了关于如何(至少部分)通过编写自己的代码来解决此问题的方法。但是,请注意,那里提供的服务似乎已确保所需的JS代码在许多浏览器中都能正常工作。我发现以下内容:

由于我还没有尝试过这些服务,所以我无法代表他们。


1
在muscula.com上注册。服务看起来非常有趣并且易于集成和使用。还有一个JavaScript库github.com/csnover/TraceKit,该库允许从客户端获取异常信息,但是您必须开发自己的服务器端登录机制。我想知道是否可以将Google Analytics(分析)用于此
Maksym Kozlenko 2012年

1
也可以使用trackjs.com,它可以跟踪用户和网络在错误发生之前所做的事情。
Todd Gardner

除了上面的列表之外, log4sure.com还免费,并且还可以实时监视日志。您还可以创建自定义日志表
Bhavin 2015年


1
jsnlog.com是免费的开放源代码
造口

12

我刚刚在工作中的项目上实现了在JavaScript错误上记录服务器端错误。使用jQuery混合了旧代码和新代码。

window.onerror将jQuery事件处理程序和onready函数与错误处理函数结合使用,并将它们包装在一起(请参阅:JavaScript错误跟踪:为什么window.onerror不够用)。

  • window.onerror:捕获IE中的所有错误(以及Firefox中的大多数错误),但在Safari和Opera中不执行任何操作。
  • jQuery事件处理程序:在所有浏览器中捕获jQuery事件错误。
  • jQuery ready函数:在所有浏览器中捕获初始化错误。

发现错误后,我向其中添加了一些其他属性(URL,浏览器等),然后使用ajax调用将其发布回服务器。

在服务器上,我有一小页,它只接收发布的参数并将其输出到我们的普通服务器日志记录框架。

我想为此开源代码(作为jQuery插件)。如果有人感兴趣,请告诉我,这将有助于说服老板!


1
此代码有机会公开吗?
路加福音

不幸的是不是:(因为我不再为公司工作,我创建的代码,但它只有大约100行代码,而应该是相当容易重新创建从细节上面。
卡尔


我已经尝试过了,但是让jquery处于依赖状态是很痛苦的,而且window.onerror很烂,它是通过CDN来提供的代码和Java脚本的精简版
Ankur Agarwal



0

如果您想将客户端错误记录回服务器,则必须进行某种服务器处理。最好的选择是拥有一个可以通过JavaScript(AJAX)访问的Web服务,并将错误日志信息传递给它。

如果问题出在托管您遇到问题的Web服务的Web服务器上,并不能100%解决问题,那么另一种选择是通过查询字符串通过标准页面发送信息,这是通过动态生成Image标签(然后将其删除)来实现的,因为浏览器将尝试加载图像源。它可以很好地绕过跨域JavaScript调用。请记住,如果有人关闭了图像,您会遇到麻烦;)



0

您可能会通过try / catch向服务器发出Ajax调用,但这可能是您可以做到的最好的事情。

我可以建议改用JavaScript单元测试吗?可能与JSUnit吗?


为什么不使用JavaScript UnitTesting的问题是因为有太多人在为网站/内容做贡献,而他们却在使用JavaScript(但是对此一无所知!),所以一般的解决方案会更好。
MADMap
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.