如何在 JavaScript 中从 Chrome 的控制台读取

IT技术 javascript google-chrome
2021-01-19 09:55:49

我想在我的应用程序中放置一个按钮,如果您按下它,它将获取写入控制台的所有内容并将其通过电子邮件发送给我(用于报告错误)。我知道我可以保留一个变量,每次执行 console.log 时也会将消息附加到该变量,但我试图将应用程序的内存消耗保持在较低水平,因此仅从安慰。

有没有办法从javascript检索控制台消息?

6个回答

你不能。无法从 JavaScript 读取控制台中的内容。

您可以做的是挂钩该console.log功能,以便在记录时进行存储:

console.stdlog = console.log.bind(console);
console.logs = [];
console.log = function(){
    console.logs.push(Array.from(arguments));
    console.stdlog.apply(console, arguments);
}

console.logs包含所有记录的内容。您可以随时通过执行 来清洁它console.logs.length = 0;

您仍然可以通过调用console.stdlog.

@dystroy:嘿,只是好奇有没有办法获取 .js 文件名和console.log调用original 的行号
2021-03-15 09:55:49
@c00000fd 您可以Error在函数内部抛出并捕获一个,然后从堆栈跟踪中解析出文件名和行。
2021-03-19 09:55:49
如果您是唯一一个从事该项目的人,您可以简单地定义一个函数,log这样您就不必输入太多内容。console.log如果您与其他人(他们可能熟悉或不熟悉您的方法)一起工作,我会按照这个答案同步它
2021-03-29 09:55:49
@c00000fd 我做的一件事是在控制台输出中放置某种唯一标识符。我不会使用行号,因为这在编辑后很容易改变,但是一些唯一的字符串来标识特定的 console.log。然后当你看到它时,很容易在文本编辑器中搜索。
2021-03-29 09:55:49
旁注,您可以像 Denys 所说的那样覆盖 console.log,或者您可以覆盖 console.error 或 console.exception 以获取特定类型的消息。适用于我的崩溃报告器,谢谢!
2021-04-04 09:55:49

获取所有控制台数据

如何在js中读取浏览器控制台错误?

如何在 JavaScript 中从 Chrome 的控制台读取

https://www.quora.com/How-do-I-read-console-window-errors-from-Chrome-using-JavaScript

日志

console.defaultLog = console.log.bind(console);
console.logs = [];
console.log = function(){
    // default &  console.log()
    console.defaultLog.apply(console, arguments);
    // new & array data
    console.logs.push(Array.from(arguments));
}

错误

console.defaultError = console.error.bind(console);
console.errors = [];
console.error = function(){
    // default &  console.error()
    console.defaultError.apply(console, arguments);
    // new & array data
    console.errors.push(Array.from(arguments));
}

警告

console.defaultWarn = console.warn.bind(console);
console.warns = [];
console.warn = function(){
    // default &  console.warn()
    console.defaultWarn.apply(console, arguments);
    // new & array data
    console.warns.push(Array.from(arguments));
}

调试

console.defaultDebug = console.debug.bind(console);
console.debugs = [];
console.debug = function(){
    // default &  console.debug()
    console.defaultDebug.apply(console, arguments);
    // new & array data
    console.debugs.push(Array.from(arguments));
}
很棒的 console.log 解决方案🚀
2021-04-03 09:55:49

我过去曾使用此代码来捕获所有控制台活动并将其与类型时间戳一起存储console.everything以便发送回服务器以诊断表单数据输入问题。我尽可能早地在<head>元素中运行此代码

if (console.everything === undefined)
{
    console.everything = [];

    console.defaultLog = console.log.bind(console);
    console.log = function(){
        console.everything.push({"type":"log", "datetime":Date().toLocaleString(), "value":Array.from(arguments)});
        console.defaultLog.apply(console, arguments);
    }
    console.defaultError = console.error.bind(console);
    console.error = function(){
        console.everything.push({"type":"error", "datetime":Date().toLocaleString(), "value":Array.from(arguments)});
        console.defaultError.apply(console, arguments);
    }
    console.defaultWarn = console.warn.bind(console);
    console.warn = function(){
        console.everything.push({"type":"warn", "datetime":Date().toLocaleString(), "value":Array.from(arguments)});
        console.defaultWarn.apply(console, arguments);
    }
    console.defaultDebug = console.debug.bind(console);
    console.debug = function(){
        console.everything.push({"type":"debug", "datetime":Date().toLocaleString(), "value":Array.from(arguments)});
        console.defaultDebug.apply(console, arguments);
    }
}
我做错了什么,因为它不起作用?只有defaultLog捕获 中的输出console.everything强制执行此错误Uncaught ReferenceError: t is not defined with let x = t.foo;is not in console.everything任何的想法?
2021-03-27 09:55:49
如何将 console.everything 重新设置为 undefined?我尝试这样做,但它在我的反应应用程序中给了我错误。
2021-03-28 09:55:49

QA Collective的解决方案是很不错,但有很多重复的代码,并没有未通过印刷捕获的错误console.logconsole.error等等。

这是他的解决方案的 DRY 和扩展版本,它捕获了更多显示在控制台中的错误消息:

if (console.everything === undefined) {
  console.everything = [];
  function TS(){
    return (new Date).toLocaleString("sv", { timeZone: 'UTC' }) + "Z"
  }
  window.onerror = function (error, url, line) {
    console.everything.push({
      type: "exception",
      timeStamp: TS(),
      value: { error, url, line }
    })
    return false;
  }
  window.onunhandledrejection = function (e) {
    console.everything.push({
      type: "promiseRejection",
      timeStamp: TS(),
      value: e.reason
    })
  } 

  function hookLogType(logType) {
    const original= console[logType].bind(console)
    return function(){
      console.everything.push({ 
        type: logType, 
        timeStamp: TS(), 
        value: Array.from(arguments) 
      })
      original.apply(console, arguments)
    }
  }

  ['log', 'error', 'warn', 'debug'].forEach(logType=>{
    console[logType] = hookLogType(logType)
  })
}   

我还更改了时间戳格式以使用 UTC 时区中的 ISO 格式,以便能够更轻松地比较不同时区的时间戳。

如果你正在工作vue.js,你实际上可以这样做:

data () {
    return {
        data: []
    }
},
created () {
    let current_log = console.log;

    console.log = msg => {
        if (msg !== undefined) this.data.push(msg);
        current_log.apply(null, arguments);
    }
}

来自控制台的所有日志都将被捕获并存储在 data

current_log.apply(null ...帮助过我。谢谢
2021-03-17 09:55:49