我想在我的应用程序中放置一个按钮,如果您按下它,它将获取写入控制台的所有内容并将其通过电子邮件发送给我(用于报告错误)。我知道我可以保留一个变量,每次执行 console.log 时也会将消息附加到该变量,但我试图保持应用程序的内存消耗较低,因此从安慰。
有没有办法从 javascript 中检索控制台消息?
我想在我的应用程序中放置一个按钮,如果您按下它,它将获取写入控制台的所有内容并将其通过电子邮件发送给我(用于报告错误)。我知道我可以保留一个变量,每次执行 console.log 时也会将消息附加到该变量,但我试图保持应用程序的内存消耗较低,因此从安慰。
有没有办法从 javascript 中检索控制台消息?
你不能。无法从 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
.
如何在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.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);
}
}
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 格式,以便能够更轻松地比较不同时区的时间戳。
如果你正在工作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
如果你只是想捕获 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
}