如何用 JavaScript 阅读 Chrome 的控制台

我想把一个按钮在我的应用程序,如果你按下它,它会得到所有的内容写到控制台和电子邮件给我(报告错误)。我知道我可以保留一个变量,每次我做一个 console. log 也附加消息到该变量,但我试图保持应用程序的内存消耗较低,所以它会更有效率,只是从控制台抓取它。

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

114073 次浏览

不行,控制台中的内容无法从 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来完成一个标准的、非存储的日志。

获取所有控制台数据

how to read browser console error in 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));
}

我过去曾使用这段代码捕获 all console activity并将其与 类别时间戳一起存储在 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);
}
}

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

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 格式,以便能够更容易地比较不同时区中的时间戳。

如果只想捕获 windows 错误(Browser 的开发人员工具) ,只需要使用 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
}