使用Firefox将JavaScript控制台记录到日志文件中

12
我们有一个 Web 应用程序,它在一个 Kiosk 模式的 Firefox 中运行,使用 RKiosk 扩展程序来实现。我们怀疑系统中存在一个非常罕见的错误,导致 JavaScript 错误。然而,由于我们无法访问 JavaScript 控制台,因此无法检查日志。
我正在寻找一种选项,使 Firefox 将所有 JavaScript 控制台消息记录到文件中,而不管打开了哪个选项卡和页面。我似乎找不到任何扩展程序可以做到这一点。我已经使用 log4javascript 将错误发送回服务器,但似乎我们的应用程序崩溃的方式跳过了日志记录。

你可以使用文件API并写入本地文件系统。 - epascarello
你能否使用你的记录器来针对 indexedDB 而不是服务器进行记录? - Mister Epic
1
你尝试过访问http://www.softwareishard.com/blog/consoleexport/吗? - Zathrus Writer
不完全是你想要的,只是我之前尝试过的一个想法:使用 window.onerror 并将所有错误保存到 localStorage。 - user123444555621
2
@NagyI 看起来你需要一个浏览器插件来处理这个问题。我试着找了一下,但没找到任何相关的内容。听起来挺有趣的周末项目。 - Munim
显示剩余3条评论
7个回答

4

对我来说,写入文件听起来像是一项繁琐的任务。它需要浏览器代码通常没有的权限,并且您必须与一个插件进行协商,以便访问文件I/O

从我的理解中,您的问题是

我想让Firefox记录所有错误

我们可以采用几种方法来解决这个问题

第一种方法 - 也将所有内容记录到localStorage:

现在,您可以将内容写入localStorageIndexedDB,而不是写入实际文件。

localStorage["myApplog"] = localStorage["myApplog"] || "";
var oldLog = console.log;
console.log = function(){
    oldLog.apply(console,arguments); // use the old console log
    var message =  "\n "+(new Date).toISOString() + " :: "+
                   Array.prototype.join.call(arguments," , "); // the arguments
    localStorage["myApplog"] += message; 
}

这个方法比较繁琐且速度较慢,但可以完成工作,你可以在本地存储中访问日志。如果我没记错的话,LocalStorage的限制大约为5MB,如果你不要过多记录日志,这应该已经足够了。你也可以选择性地运行它。
第二种方法 - 仅记录错误
这与Pumbaa80建议的类似。你可以简单地覆盖window.onerror,并仅记录错误信息。
// put an empty string in loggedWinErrors first
var oldError = window.onerror || function(){};
window.onerror = function(err,url,lineNumber){
   oldError.call(this,err,url,lineNumber);
   var err ="\n Error: (file: " + url+", error: "+err+", lineNumber: "+lineNumber+")"); 
   localStorage["loggedWinErrors"] += err;
}

第三种激进方法 - 使用虚拟机。

这是最强大的版本,但它提供了最麻烦的用户体验。您在虚拟机中运行信息亭,检测到未捕获的异常时 - 冻结该机器并保存其状态,并运行备份虚拟机。我只在处理最可怕的错误时才需要这样做,而且不太美观。除非您真的想要整个捕获的状态 - 不要这样做。

实际上,在此之前先进行扩展 - 这很繁琐,但可以得到非常可靠的结果。


总之,我认为第一种方法甚至只有第二种方法已经足够满足你的需求了。 localStorage 是一个抽象的存储空间,网页可以在其中保存状态而不会出现安全问题。如果这还不够大,我们可以考虑使用 IndexedDB 方案。
所有这些都取决于你的用例。

你说浏览器代码没有使用文件I/O的特权。这在浏览器扩展中也是这样吗?我正在寻找比将举重运动放入我的Web应用程序更通用的东西。在Firefox中安装某些东西,可以在后台透明地记录所有内容。 - NagyI
浏览器扩展确实可以访问文件I/O。您可以查看我在前两行末尾链接的教程 - 它包含了很多代码示例,可以帮助您。如果您想将其从应用程序中抽象出来,只需覆盖postMessage,然后向负责处理它的worker发送消息即可。请注意,I/O的成本相当高昂。 - Benjamin Gruenbaum
谢谢。我会很快尝试一下这个。 - NagyI
@NagyI 请提供反馈。 - Benjamin Gruenbaum
抱歉我没有时间进行实验,而且我离线了几天,所以你自动获得了赏金。感谢所有提到的解决方案,我认为你们都应该得到赏金,尽管vbail的解决方案最接近我想要的,所以我接受了那个。 - NagyI

3
你可以使用XULRunner,它是一种Mozilla的运行时环境,用于XUL应用程序。它使用Gecko,就像Firefox一样,并且具有以下功能:
  1. 您可以访问文件系统或使用SQLite数据库来存储日志。
  2. 您可以在全屏模式下呈现您的信息亭,而无需使用扩展。

我从没想过用XULRunner实现这个,但听起来是个好主意。如果可以的话,我会研究一下的。 - NagyI

2

你试过jserrorcollector吗?我们正在使用它,它在Firefox中运行良好。它只适用于Java。

// Initialize
FirefoxProfile ffProfile = null;
ffProfile = new FirefoxProfile();
JavaScriptError.addExtension(ffProfile);

 // Get the errors
List<JavaScriptError> jsErrors = JavaScriptError.readErrors(webDriver);

更多信息: https://github.com/mguillem/JSErrorCollector

哇,有趣的解决方案。我一定会尝试这个方法。这样我就可以使用外部Java引导程序打包整个应用程序,启动Web服务器和Firefox。这是最接近我想要的东西,所以我接受这个答案。 - NagyI

1

1

你考虑过远程日志记录吗?

我通常将window.onerror分配为向Web服务器发送请求,将错误的详细信息远程存储。如果你愿意,也可以使用console.log实现同样的功能。


OP已经在进行远程记录。 - Benjamin Gruenbaum

0

0
你可以使用像Qbaka这样的远程日志记录脚本。它可以捕获每个JS错误并将其发送到Qbaka服务器。在那里,您可以登录并查看所有JS错误。Qbaka存储每个错误消息的确切错误消息、脚本、行号、堆栈跟踪和使用的浏览器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接