web-dev-qa-db-fra.com

Journalisation des erreurs JavaScript côté client sur le serveur

Im exécutant un site ASP.NET où j'ai des problèmes pour trouver des erreurs JavaScript uniquement avec des tests manuels.

Est-il possible d'attraper toutes les erreurs JavaScript sur le côté client et de les enregistrer sur le serveur, c'est-à-dire dans le journal des événements (via Webservice ou quelque chose comme ça)?

91
MADMap

Vous pouvez essayer de configurer votre propre gestionnaire pour le événement onerror et utiliser XMLHttpRequest pour dire au serveur ce qui ne va pas, mais comme cela ne fait partie d'aucune spécification, le support est quelque peu floconneux .

Voici un exemple de tilisation de XMLHttpRequest pour enregistrer les erreurs 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);
};
67
Jonny Buchanan

Réponse courte: Oui, c'est possible.

Réponse plus longue: Les gens ont déjà écrit comment vous pouvez (au moins partiellement) résoudre ce problème en écrivant votre propre code. Cependant, notez qu'il existe des services qui semblent avoir fait en sorte que le code JS nécessaire fonctionne dans de nombreux navigateurs. J'ai trouvé ce qui suit:

Je ne peux parler pour aucun de ces services car je ne les ai pas encore essayés.

26
Ztyx

Je viens d'implémenter la journalisation des erreurs côté serveur sur les erreurs javascript sur un projet au travail. Il existe un mélange de code hérité et de nouveau code utilisant jQuery .

J'utilise une combinaison de window.onerror et encapsulant les gestionnaires d'événements jQuery et la fonction onready avec une fonction de gestion des erreurs (voir: Suivi des erreurs JavaScript: pourquoi window.onerror n'est pas suffisant ).

  • window.onerror: intercepte toutes les erreurs dans IE (et la plupart des erreurs dans Firefox), mais ne fait rien dans Safari et Opera.
  • gestionnaires d'événements jQuery: capture les erreurs d'événements jQuery dans tous les navigateurs.
  • fonction jQuery ready: capture les erreurs d'initialisation dans tous les navigateurs.

Une fois l'erreur détectée, j'y ajoute des propriétés supplémentaires (URL, navigateur, etc.), puis je la renvoie sur le serveur à l'aide d'un appel ajax.

Sur le serveur, j'ai une petite page qui prend simplement les arguments publiés et les renvoie à notre cadre de journalisation de serveur normal.

Je voudrais ouvrir le code source pour cela (en tant que plugin jQuery). Si quelqu'un est intéressé faites le moi savoir, cela aiderait à convaincre les patrons!

12
Karl

Si vous utilisez Google Analytics, vous pouvez enregistrer des erreurs javascript dans les événements Google Analytics.

Voir cette application: http://siteapps.com/app/log_javascript_errors_with_ga-181

J'espère que cela aide.

1
Leandro Lages

J'ai utilisé Appfail récemment, ce qui capture les erreurs asp.net et JavaScript

0
levelnis

Si vous souhaitez enregistrer les erreurs côté client sur le serveur, vous devrez effectuer une sorte de traitement sur le serveur. Le mieux serait d'avoir un service web auquel vous pouvez accéder via JavaScript (AJAX) et vous lui transmettez vos informations de journal d'erreurs.

Ne résout pas à 100% le problème car si le problème vient du serveur Web hébergeant le service Web que vous rencontrez des problèmes, vous pouvez également envoyer les informations via une page standard via une chaîne de requête, une méthode de cela se fait via la génération dynamique de balises d'image (qui sont ensuite supprimées) car le navigateur essaiera de charger la source d'une image. Il contourne bien les appels JavaScript inter-domaines. Gardez à l'esprit que vous avez des problèmes si quelqu'un a des images désactivées;)

0
Aaron Powell

Vous pouvez potentiellement faire un appel Ajax au serveur à partir d'un essai/capture, mais c'est probablement le mieux que vous puissiez faire.

Puis-je suggérer des tests unitaires JavaScript à la place? Peut-être avec JSUnit ?

0
Mike Stone

Je recommande également d'utiliser l'utilitaire Trace Tool , il est livré avec le support JavaScript et est très pratique pour la surveillance JS.

0
cleg