102

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

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

4

6 回答 6

119

你不能。无法从 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.

于 2013-11-07T20:33:16.310 回答
31

获取所有控制台数据

如何在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));
}
于 2018-09-03T02:29:08.183 回答
16

我过去曾使用此代码来捕获所有控制台活动并将其与类型时间戳一起存储,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);
    }
}
于 2019-04-10T01:52:56.143 回答
4

QA Collective的解决方案非常好,但是有很多重复的代码,并且不会捕获未通过 , 等打印的console.log错误console.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 格式,以便能够更轻松地比较不同时区的时间戳。

于 2021-05-08T15:59:48.793 回答
3

如果你正在工作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

于 2020-09-01T23:17:48.963 回答
0

如果你只是想捕获 windows 错误(浏览器的开发者工具),你只需要使用 window.onerror 监听器。最重要的是继续返回 false,因为如果在回调中返回 true,则错误的传播将停止并且不会再登录控制台。

window.onerror = function myErrorHandler(err, url, line) {  
    //Do some  stuff 
    console.log(err) // Uncaught SyntaxError: Invalid or unexpected token at Line no:- 1
    return false;   // so you still log errors into console 
}
于 2021-06-22T09:28:13.667 回答