Есть ли способ в JavaScript для прослушивания событий консоли? - PullRequest
15 голосов
/ 03 ноября 2011

Я пытаюсь написать обработчик для необработанных исключений и предупреждений браузера в 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, но для предупреждений.Есть мысли?

Ответы [ 6 ]

16 голосов
/ 03 ноября 2011

Вы можете просто обернуть 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);
};
6 голосов
/ 27 декабря 2016

Больше Succint Way:

// 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's 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's 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);
2 голосов
/ 07 марта 2017

Я знаю, что это старый пост, но в любом случае он может быть полезен, поскольку другие решения не совместимы со старыми браузерами.

Вы можете переопределить поведение каждой функции консоли (и для всех браузеров ) следующим образом:

// 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;
1 голос
/ 27 января 2019

Мне нужно было отлаживать вывод консоли на мобильных устройствах, поэтому я построил эту библиотеку для захвата, чтобы записывать вывод и категорию консоли и выводить ее на страницу. Проверьте исходный код, это довольно просто.

https://github.com/samsonradu/Consolify

0 голосов
/ 03 ноября 2011

Вы идете об этом задом наперед.Вместо перехвата, когда регистрируется ошибка, инициируйте событие как часть механизма обработки ошибок и зарегистрируйте его как один из прослушивателей событий:

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 и строго упрощен дляиспользовать в качестве примера.

0 голосов
/ 03 ноября 2011

В той же функции, которую вы используете для console.log (), просто отправьте то же сообщение веб-службе, в которую вы записываете журналы.

...