Registro de errores de JavaScript del lado del cliente en el servidor [cerrado]


97

Estoy ejecutando un sitio ASP.NET donde tengo problemas para encontrar algunos errores de JavaScript solo con las pruebas manuales.

¿Existe la posibilidad de detectar todos los errores de JavaScript en el lado del cliente y registrarlos en el servidor, es decir, en el EventLog (a través del servicio web o algo así)?


El problema por el que no estamos usando JavaScript UnitTesting es porque hay demasiadas personas contribuyendo al Sitio / Contenido y están usando JavaScript. El contenido no es nada que nos deba preocupar (como desarrolladores), pero hay errores en el código. Entonces, una solución general sería mejor.
MADMap

Supongo que no te refieres al usuario promedio contribuido (de lo contrario, es un agujero XSS) ... pero ... tal vez podrías aislar su JS en try / catch para que al menos no afecte tu propio JS ... sin saber la dinámica del sitio, no sé si esto ayudará o no ...
Mike Stone

El contenido es de otros equipos de la empresa, no de los usuarios, por lo que no es un riesgo de seguridad
MADMap

Bugsnag registrará automáticamente sus errores y los mostrará en un tablero. Funciona para .NET y JS.
Don P

Respuestas:


68

Puede intentar configurar su propio controlador para el evento onerror y usar XMLHttpRequest para decirle al servidor qué salió mal; sin embargo, dado que no forma parte de ninguna especificación, el soporte es algo inestable .

A continuación, se muestra un ejemplo del uso de XMLHttpRequest para registrar errores de JavaScript :

window.onerror = function(msg, url, line)
{
  var req = new XMLHttpRequest();
  var params = "msg=" + encodeURIComponent(msg) + '&url=' + encodeURIComponent(url) + "&line=" + line;
  req.open("POST", "/scripts/logerror.php");
  req.send(params);
};

Acabo de lanzar un control de servidor que le ayuda a hacer esto en thecodepage.com/post/JavaScript-Error-Notifications.aspx
Gabriel McAdams

2
¿Se repetirá infinitamente si se bloquea en el controlador?
Jean-Philippe Leclerc

2
@ Jean-PhilippeLeclerc Sí. Y lo que es peor, DoS el punto final de su servidor si alguna vez cae en un bucle de error. Debe agregar una función de limitación a esto para evitar que un cliente llegue al servidor demasiado rápido. Aquí hay un ejemplo de esto de {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Todd Gardner

También puede cifrar un token que incluye la identificación del usuario, la IP, una pequeña cadena aleatoria (para frustrar los ataques de texto plano conocido si su algoritmo de cifrado es rápido pero débil) y una marca de tiempo e incluirlo como una variable JS en la página. Luego, esto se puede enviar con el informe de error y verificar antes de permitir que se agregue a los registros. Esto ayuda a probar la autenticidad probable del mensaje de error y protege de los ataques DoS tontos, pero aún así no lo protegerá de intentos DoS más sofisticados como lo hará la limitación.
mormegil

Esto puede abrumar a su servidor, por ejemplo, si obtiene un error en el setIntervalmétodo. Hay muchos servicios de informes de errores de JS disponibles en la web. Pedido ErrLytics . También le brinda análisis de cada acción de los usuarios en su sitio web.
Vivek Marakana

28

Respuesta corta: Sí, es posible.

Respuesta más larga: la gente ya ha escrito sobre cómo puede (al menos parcialmente) resolver este problema escribiendo su propio código. Sin embargo, tenga en cuenta que existen servicios que parecen haberse asegurado de que el código JS necesario funcione en muchos navegadores. Encontré lo siguiente:

No puedo hablar por ninguno de estos servicios porque todavía no los he probado.


1
Registrado en muscula.com. El servicio parece muy interesante y fácil de integrar y usar. También existe la biblioteca JavaScript github.com/csnover/TraceKit que permite obtener una información de excepción del cliente, pero debe desarrollar su propio mecanismo de registro del lado del servidor. Me pregunto si Google Analytics podría usarse para eso
Maksym Kozlenko

1
trackjs.com también, y rastrea lo que el usuario y la red estaban haciendo antes del error.
Todd Gardner

Además de la lista anterior, log4sure.com es gratis y también tiene monitoreo en tiempo real de los registros. También puede crear su tabla de registro personalizada
Bhavin

erroralerts.com no encontrado
Kiquenet

1
jsnlog.com es gratuito y de código abierto .
Stomy

12

Acabo de implementar el registro de errores del lado del servidor en errores de JavaScript en un proyecto en el trabajo. Hay una mezcla de código heredado y código nuevo usando jQuery .

Utilizo una combinación de window.onerrory envolviendo los controladores de eventos jQuery y la función onready con una función de manejo de errores (ver: Seguimiento de errores de JavaScript: Por qué window.onerror no es suficiente ).

  • window.onerror: detecta todos los errores en IE (y la mayoría de los errores en Firefox), pero no hace nada en Safari y Opera.
  • Controladores de eventos de jQuery: detecta errores de eventos de jQuery en todos los navegadores.
  • Función jQuery ready: detecta errores de inicialización en todos los navegadores.

Una vez que he detectado el error, le agrego algunas propiedades adicionales (url, navegador, etc.) y luego lo publico en el servidor usando una llamada ajax.

En el servidor tengo una pequeña página que solo toma los argumentos publicados y los envía a nuestro marco de registro de servidor normal.

Me gustaría abrir el código fuente para esto (como un complemento jQuery). Si alguien está interesado, hágamelo saber, ¡ayudaría a convencer a los jefes!


1
¿Alguna posibilidad de que este código esté disponible?
Luke

Lamentablemente no :( ya que ya no trabajo para la empresa donde creé ese código. Pero solo eran unas 100 líneas de código, y debería ser razonablemente fácil de recrear a partir de los detalles anteriores.
Karl


Lo he intentado, pero mantener jquery en la dependencia es un problema y window.onerror apesta para el código minificado y javascript que se sirve a través de cdns
Ankur Agarwal


0

También recomiendo usar la utilidad TraceTool , viene con soporte JavaScript y es muy útil para el monitoreo de JS.


¿TraceTool está muerto?
Kiquenet

0

Si desea registrar los errores del lado del cliente en el servidor, tendrá que realizar algún tipo de procesamiento del servidor. Lo mejor sería tener un servicio web al que pueda acceder a través de JavaScript (AJAX) y le pase la información del registro de errores.

No resuelve el problema al 100% porque si el problema es con el servidor web que aloja el servicio web, tiene problemas, su otra opción sería enviar la información a través de una página estándar a través de una cadena de consulta, un método de hacer eso es a través de la generación dinámica de etiquetas de imagen (que luego se eliminan) ya que el navegador intentará cargar la fuente de una imagen. Sin embargo, maneja muy bien las llamadas de JavaScript entre dominios. Tenga en cuenta que está en problemas si alguien tiene las imágenes desactivadas;)



0

Potencialmente, podría hacer una llamada Ajax al servidor desde un intento / captura, pero eso es probablemente lo mejor que puede hacer.

¿Puedo sugerir pruebas unitarias de JavaScript en su lugar? ¿Posiblemente con JSUnit ?


El problema por el que no usamos JavaScript UnitTesting es porque hay demasiadas personas contribuyendo al Sitio / Contenido y están usando JavaScript (¡pero no tengo ni idea de ello!), Por lo que sería mejor una solución general.
MADMap
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.