【问题标题】:Enable users of a WebRtc app to download webrtc logs via javascript使 WebRtc 应用程序的用户能够通过 javascript 下载 webrtc 日志
【发布时间】:2017-12-09 16:37:17
【问题描述】:

我看过以下内容:

chrome://webrtc-internals 

但是,我正在寻找一种方法,让用户从 Web 应用程序中单击一个按钮以下载或 - 最好 - POST WebRtc 将日志记录到应用程序中的端点。我的想法是,我可以让非技术用户通过单击 UI 按钮与我共享技术日志。

如何做到这一点?

注意:这不应该依赖于 Chrome; Chromium 也将被使用,因为应用程序将被封装在 Electron 中。

【问题讨论】:

标签: javascript google-chrome-devtools webrtc electron chromium


【解决方案1】:

您需要编写一个等效的 javascript 来捕获所有 RTCPeerConnection API 调用。 rtcstats.js 会这样做,但会将所有数据发送到服务器。如果您将该行为替换为将其存储在内存中,您应该会很好。

【讨论】:

  • 您对我发布的解决方案有何看法?这是否会提供调试大多数 WebRTC 问题所需的见解?
  • 在大多数情况下,我发现 API 跟踪比 getStats 结果更有帮助——请参阅testrtc.com/webrtc-api-trace。此外,您正在使用应避免使用的旧版 chrome stats api。
  • 您是否有一个示例来演示如何在客户端转储这些日志(或者甚至根本如何使用它 - 我没有看到太多关于配置的文档)?我认为这对未来的读者最有帮助。
  • 我推送了一个提交 here——本质上是使用 npm run dist 构建捆绑版本,然后在包含的测试页面上创建一个 peerconnection 并检查 window.rtcstats.connections
  • 我讨厌痛苦——但我还是不清楚。我认为有一个独立的例子来说明如何require 这个并在不依赖于构建节点(或某些外部服务器)的情况下使用它会帮助更多的人;就像在答案中有任何相关代码一样。如果您没有时间,请完全理解它-如果是这种情况,我可以尝试弄清楚并张贴。我认为这里最常见的用例是“允许我在客户端记录这些(或访问这些)日志,以便我可以决定如何处理它们。”一个明确的设置示例肯定会帮助其他正在寻找它的人。
【解决方案2】:

这就是我最终使用的(用下划线或其他代替敲除):

            connectionReport.signalingState = connection.signalingState;
            connectionReport.stats = [];
            connection.getStats(function (stats) {
                const reportCollection = stats.result();
                ko.utils.arrayForEach(reportCollection, function (innerReport) {
                    const statReport = {};
                    statReport.id = innerReport.id;
                    statReport.type = innerReport.type;
                    const keys = innerReport.names();
                    ko.utils.arrayForEach(keys, function (reportKey) {
                        statReport[reportKey] = innerReport.stat(reportKey);
                    })
                    connectionReport.stats.push(statReport);
                });
                connectionStats.push(connectionReport);
            });

更新:

这种getStats 机制似乎即将被弃用。

【讨论】:

    【解决方案3】:

    阅读chrome://webrtc-internals的js源码,发现网页使用chrome.send()的方法发送chrome.send('enableEventLogRecordings');之类的消息,执行日志命令。 根据here

    chrome.send() 是一个私有函数,只对内部 chrome 可用 页面。

    所以该函数是沙盒化的,因此无法访问它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 2022-08-21
      相关资源
      最近更新 更多