如何在JavaScript中阅读Chrome控制台

Mik*_*ike 51 javascript google-chrome

我想在我的应用程序中放一个按钮,如果按下它,它将获取写入控制台的所有内容并通过电子邮件发送给我(用于报告错误).我知道我可以保留一个变量,每次我做一个console.log也会将消息附加到该变量但是我试图将应用程序的内存消耗保持在低水平,这样只需要从中获取它就会更有效率安慰.

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

谢谢

Den*_*ret 64

你不能.无法从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);
}
Run Code Online (Sandbox Code Playgroud)

console.logs包含记录的所有内容.你可以随时清理它console.logs.length = 0;.

您仍然可以通过调用进行标准的非存储日志console.stdlog.

  • @dystroy:嘿,好奇有没有办法得到.js文件名和原始`console.log`被调用的行号? (2认同)
  • @c00000fd 您可以在函数内抛出并捕获“Error”,然后从堆栈跟踪中解析出文件名和行。 (2认同)

Ben*_*ida 17

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)
  })
}   
Run Code Online (Sandbox Code Playgroud)

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


QA *_*ive 14

我过去曾使用此代码来捕获所有控制台活动并将其与类型时间戳一起存储,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);
    }
}
Run Code Online (Sandbox Code Playgroud)


xgq*_*ata 7

获取所有控制台数据

如何读取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));
}
Run Code Online (Sandbox Code Playgroud)

错误

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));
}
Run Code Online (Sandbox Code Playgroud)

警告

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));
}
Run Code Online (Sandbox Code Playgroud)

调试

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));
}
Run Code Online (Sandbox Code Playgroud)


Eds*_*ala 6

如果你正在研究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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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


小智 5

如果你只是想捕获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 
}
Run Code Online (Sandbox Code Playgroud)