Есть ли способ в JavaScript прослушать события консоли?
Я пытаюсь написать обработчик для необработанных исключений и предупреждений браузера в Javascript. Все ошибки и предупреждения должны быть отправлены на сервер для последующего просмотра.
Обработанные исключения могут быть перехвачены и легко зарегистрированы с
console.error("Error: ...");
или же
console.warn("Warning: ...");
Таким образом, они не являются проблемой, если они вызываются из кода JavaScript, даже больше, необработанные исключения могут быть пойманы с этим спокойствием кода:
window.onerror = function(){
// add to errors Stack trace etc.
});
}
так что исключения довольно прикрыты, но я застрял с предупреждениями, которые браузер отправляет на консоль. Например, предупреждения безопасности или проверки HTML. Пример ниже взят из консоли Google Chrome
На странице по адресу https://domainname.com/ размещался небезопасный контент с http://domainname.com/javascripts/codex/MANIFEST.js.
Было бы здорово, если бы было какое-то событие, например, window.onerror, но для предупреждений. Какие-нибудь мысли?
Ответы
Ответ 1
Вы можете просто обернуть методы console
самостоятельно. Например, для записи каждого вызова в массиве:
var logOfConsole = [];
var _log = console.log,
_warn = console.warn,
_error = console.error;
console.log = function() {
logOfConsole.push({method: 'log', arguments: arguments});
return _log.apply(console, arguments);
};
console.warn = function() {
logOfConsole.push({method: 'warn', arguments: arguments});
return _warn.apply(console, arguments);
};
console.error = function() {
logOfConsole.push({method: 'error', arguments: arguments});
return _error.apply(console, arguments);
};
Ответ 2
Больше пути сукцина:
// this method will proxy your custom method with the original one
function proxy(context, method, message) {
return function() {
method.apply(context, [message].concat(Array.prototype.slice.apply(arguments)))
}
}
// let do the actual proxying over originals
console.log = proxy(console, console.log, 'Log:')
console.error = proxy(console, console.error, 'Error:')
console.warn = proxy(console, console.warn, 'Warning:')
// let test
console.log('im from console.log', 1, 2, 3);
console.error('im from console.error', 1, 2, 3);
console.warn('im from console.warn', 1, 2, 3);
Ответ 3
Я знаю, что это старый пост, но он может быть полезен, так как другие решения не совместимы со старыми браузерами.
Вы можете переопределить поведение каждой функции консоли (и всех браузеров) следующим образом:
// define a new console
var console = (function(oldCons){
return {
log: function(text){
oldCons.log(text);
// Your code
},
info: function (text) {
oldCons.info(text);
// Your code
},
warn: function (text) {
oldCons.warn(text);
// Your code
},
error: function (text) {
oldCons.error(text);
// Your code
}
};
}(window.console));
//Then redefine the old console
window.console = console;
Ответ 4
В той же функции, которую вы используете для выполнения console.log(), просто отправляйте одно и то же сообщение на веб-службу, в которую вы записываете журналы.
Ответ 5
Вы идете об этом назад. Вместо того, чтобы перехватывать, когда регистрируется ошибка, активируйте событие как часть механизма обработки ошибок и зарегистрируйте его как один из прослушивателей событий:
try
{
//might throw an exception
foo();
}
catch (e)
{
$(document).trigger('customerror', e);
}
function customErrorHandler(event, ex)
{
console.error(ex)
}
function customErrorHandler2(event, ex)
{
$.post(url, ex);
}
этот код использует jQuery и строго упрощен для использования в качестве примера.
Ответ 6
Мне нужно было отладить вывод консоли на мобильных устройствах, поэтому я построил эту библиотеку для захвата, чтобы записывать вывод и категорию консоли и выводить ее на страницу. Проверить исходный код, это довольно просто.
https://github.com/samsonradu/Consolify