2011-11-03 25 views
12

Estoy intentando escribir controlador para excepciones no detectadas y advertencias del navegador en javascript. Todos los errores y advertencias deben enviarse al servidor para su posterior revisión.¿Hay alguna forma en JavaScript para escuchar eventos de la consola?

excepciones manejadas pueden ser capturados y fácilmente conectados con

console.error("Error: ..."); 

o

console.warn("Warning: ..."); 

Así que no son un problema si se les llama de código javascript, aún más, las excepciones no controladas pueden ser capturados con esta paz de código:

window.onerror = function(){ 
    // add to errors Stack trace etc. 
    }); 
} 

por lo que las excepciones son bastante cov pero me he quedado con las advertencias que el navegador envía a la consola. Por ejemplo, seguridad o advertencias de validación html. Ejemplo a continuación se toma de la consola de cromo Google

La página a la https://domainname.com/ corrieron contenido no seguro de http://domainname.com/javascripts/codex/MANIFEST.js.

Sería genial si hay algún evento como window.onerror pero para advertencias. ¿Alguna idea?

+0

Me preguntaba lo mismo. Registrar resultados de solicitud de recursos negativos también sería genial. :) – SimplGy

Respuesta

12

Puede simplemente ajustar los métodos console usted mismo. Por ejemplo, para registrar cada llamada en una matriz:

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

Estaba pensando en esto, pero no funcionará para algunas de mis expectativas, por ejemplo, mientras todo se carga en la página segura recibiré muchas advertencias cuando se cargue contenido no seguro, y eso proviene del navegador, no del código JavaScript. También quiero cubrir el estúpido IE (que es por lo que esto se me ocurrió) y la consola no está definida allí. De todos modos, obtuviste mi voto :) –

+0

Para IE usa 'var message = Array.prototype.slice.apply (arguments) .join (''); return _error (message); 'etc. –

0

En la misma función que está utilizando para hacer console.log(), sólo tiene que publicar el mismo mensaje a un servicio web que está grabando los registros en .

+0

No es una opción, es caro, ¿qué pasa si la página tiene 100 errores y advertencias, debo hacer para cada solicitud de Ajax, no lo creo así –

+0

@MilanJaric, su objeción no hace sentido. Si está capturando la salida de la consola, todavía estaría haciendo 100 llamadas AJAX. –

+0

no Lo estoy guardando en una variable (objeto) y cuando el usuario está a punto de abandonar la página, publicará los datos en el servidor. –

0

Estás haciendo esto al revés. En lugar de interceptar cuando se registra un error, activar un evento como parte del mecanismo de manejo de errores y registrarlo como uno de los detectores de eventos:

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); 
} 

este código utiliza jQuery y se simplifica estrictamente para uso como un ejemplo .

+0

jQuery no es una opción, ¿qué pasa si no se carga :) –

+0

@MilanJaric, entonces ¿qué ocurre si el código de manejo de errores no se carga? ¿Qué sucede si falla su llamada a AJAX-log-to-database? –

+0

no lo hará si está dentro de la página ' ' –

2

forma más sucinta:

// 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);

0

Sé que es una entrada antigua, pero puede ser útil como solución de todos modos otros no son compatibles con los navegadores antiguos.

Puede volver a definir el comportamiento de cada función de la consola (y para todos los navegadores ) así:

// 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; 
Cuestiones relacionadas