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

Posted

技术标签:

【中文标题】使用 Firefox 将 JavaScript 控制台记录到日志文件中【英文标题】:Log JavaScript console into a log file with Firefox 【发布时间】:2013-10-18 08:52:30 【问题描述】:

我们有一个在 kiosk 模式下运行的网络应用程序 Firefox,使用 RKiosk 扩展来实现这一点。我们怀疑系统中有一个非常罕见的错误,它会导致 javascript 错误。但是,由于我们无法访问 JavaScript 控制台,我们无法检查日志。

我正在寻找一个选项,让 Firefox 将所有 JavaScript 控制台消息记录到一个文件中,而不管打开的选项卡和页面如何。我似乎找不到任何扩展名。我已经在使用 log4javascript 将错误发送回服务器,但似乎我们的应用程序崩溃了,它完全跳过了日志记录。

【问题讨论】:

你可以使用文件api写入本地文件系统。 使用记录器而不是服务器来定位 indexedDb 的驾驶室? 你试过softwareishard.com/blog/consoleexport了吗? 不是你要找的,只是我之前尝试过的一个想法:使用window.onerror并将所有错误保存到localStorage。 @NagyI 听起来你需要一个浏览器插件来解决这个问题。我试图寻找一个,但找不到任何一个。听起来像是一个有趣的周末项目。 【参考方案1】:

对我来说,写入文件听起来像是一项乏味的任务。它需要浏览器代码通常没有的权限,并且您必须与必须编写的附加组件协商才能访问file 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;

第三种极端方法 - 使用虚拟机。

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

真的,在此之前进行扩展 - 这很乏味,但会得到非常可靠的结果。


总之,我认为第一种方法甚至第二种方法都足以满足您的需求。 localStorage 是网页获取的一种抽象存储,用于在没有安全问题的情况下保存状态。如果这还不够大,我们可以讨论 IndexedDB 解决方案。

这完全取决于您的用例。

【讨论】:

您说浏览器代码没有使用文件 I/O 的权限。浏览器扩展是这种情况吗?我正在寻找比将举重放入我的 web 应用程序更通用的东西。在 Firefox 中安装一些东西,它会在后台透明地记录所有内容。 浏览器扩展确实可以访问文件 I/O。您可以查看我在前两行末尾链接的教程 - 它包含许多可以帮助您的代码示例。如果您想从您的应用程序中抽象出它,您可以覆盖 postMessage,然后将消息发布给负责处理它的工作人员。请注意,无论如何,I/O 都相当昂贵。 谢谢。我很快就会对此进行试验。 @NagyI 请提供反馈。 对不起,我没有时间进行实验,而且我已经离线几天了,所以你自动获得了赏金。感谢所有提到的解决方案,我认为你应该得到赏金,尽管 vbail 的解决方案最接近我正在寻找的解决方案,所以我接受了。【参考方案2】:

您可以使用 XULRunner...XUL 应用程序的 Mozilla 运行时环境。它像 Firefox 一样使用 Gecko,并且:

    您可以访问文件系统或使用SQLite 数据库来存储日志。 您可以在不使用扩展程序的情况下以全屏模式呈现您的信息亭。

【讨论】:

我从没想过为此使用 XULRunner,但这似乎是个好主意。如果可以的话,我会检查一下。【参考方案3】:

你试过 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 boostapp 应用程序打包我的整个应用程序,该应用程序也可以启动网络服务器和 Firefox。这是最接近我想要的东西,所以我接受这个答案。【参考方案4】:

您考虑过远程记录吗?

我通常指定window.onerror 向远程存储错误详细信息的网络服务器发送请求。如果您愿意,也可以对 console.log 执行相同的操作。

【讨论】:

***.com/questions/19298420/… OP 已经在进行远程日志记录了。【参考方案5】:

尝试以下控制台导出。它是 Firefox 的Firebug 的插件。这很方便。

http://www.softwareishard.com/blog/consoleexport/

【讨论】:

【参考方案6】:

如果您能够/愿意从 Firefox 切换到 Chrome 或 Opera,您将能够使用 Sandboxed Filesystem API 来编写本地文件。见:

http://www.html5rocks.com/en/tutorials/file/filesystem/ http://caniuse.com/filesystem

使用chrome.exe --kiosk &lt;url&gt;以信息亭模式启动

然后您需要禁用 Alt-F4 和 Ctrl-Alt-Del,这在 Windows 上可以使用多个第三方工具完成,例如 Auto Hotkey (Disable Ctrl-Alt-Del Script)。

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于使用 Firefox 将 JavaScript 控制台记录到日志文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何让用户使用纯 Javascript 将剪贴板中的图像数据粘贴到 Firefox 中的画布元素中?

Javascript / CSS:设置(firefox)iframe的缩放级别?

JavaScript / jQuery:如何在 Firefox 中获取选定的文本

javascript Bootstrap Carousel触控支持

获取煎茶触控平台名称

如何使用 jquery\javascript 从 firefox 浏览器打印 PDF 文档?