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


97

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

Est-il possible de détecter toutes les erreurs JavaScript du côté client et de les enregistrer sur le serveur, c'est-à-dire dans le EventLog (via Webservice ou quelque chose du genre)?


Le problème pour lequel nous n'utilisons pas JavaScript UnitTesting est qu'il y a trop de gens qui contribuent au site / contenu et qu'ils utilisent JavaScript. Le contenu ne nous intéresse pas (en tant que développeurs), mais il y a des erreurs dans le code. Une solution générale serait donc préférable.
MADMap

Je suppose que vous ne voulez pas dire que l'utilisateur moyen a contribué (sinon c'est le trou XSS) ... mais ... vous pourriez peut-être isoler leur JS dans try / catch pour que cela n'affecte au moins pas votre propre JS ... sans le savoir la dynamique du site, je ne sais pas si cela aidera ou pas ...
Mike Stone

Le contenu provient d'autres équipes de l'entreprise, pas d'utilisateurs, donc ce n'est pas un risque pour la sécurité
MADMap

Bugsnag enregistrera automatiquement vos erreurs et les affichera dans un tableau de bord. Fonctionne pour .NET et JS.
Don P

Réponses:


68

Vous pouvez essayer de configurer votre propre gestionnaire pour l' événement onerror et utiliser XMLHttpRequest pour indiquer au serveur ce qui n'a pas fonctionné, mais comme cela ne fait partie d'aucune spécification, le support est quelque peu irrégulier .

Voici un exemple de Utilisation de XMLHttpRequest pour consigner 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);
};

Je viens de publier un contrôle serveur qui vous aide à le faire sur thecodepage.com/post/JavaScript-Error-Notifications.aspx
Gabriel McAdams

2
Sera-t-il bouclé à l'infini s'il plante dans le gestionnaire?
Jean-Philippe Leclerc

2
@ Jean-PhilippeLeclerc Oui. Et pire, cela fera du tort votre point de terminaison de serveur si jamais vous tombez dans une boucle d'erreur. Vous devez ajouter une fonction de limitation à cela pour empêcher un client d'atteindre le serveur trop rapidement. Voici un exemple de ceci de {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo
Todd Gardner

Vous pouvez également crypter un jeton qui comprend l'ID de l'utilisateur, l'adresse IP, une petite chaîne aléatoire (pour déjouer les attaques en texte brut connu si votre algorithme de cryptage est rapide mais faible), et un horodatage et l'inclure en tant que variable JS dans la page. Cela peut ensuite être soumis avec le rapport d'erreur et vérifié avant de permettre son ajout aux journaux. Cela aide à prouver l'authenticité probable des messages d'erreur et protège des attaques DoS stupides, mais ne vous protégera toujours pas contre les tentatives DoS plus sophistiquées comme le fera la limitation.
mormegil

Cette chose peut submerger votre serveur, par exemple si vous obtenez une erreur de setIntervalméthode. Il existe de nombreux services de rapport d'erreurs JS disponibles sur le Web. Commander ErrLytics . Il vous donne également des analyses de chaque action de l'utilisateur sur votre site Web.
Vivek Marakana

28

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

Réponse plus longue: les gens ont déjà écrit sur la façon dont 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 veillé à ce 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.


1
Enregistré sur muscula.com. Le service semble très intéressant et facile à intégrer et à utiliser. Il existe également la bibliothèque JavaScript github.com/csnover/TraceKit qui permet d'obtenir des informations d'exception du client, mais vous devez développer votre propre mécanisme de journalisation côté serveur. Je me demande si Google Analytics pourrait être utilisé pour cela
Maksym Kozlenko

1
trackjs.com également, et il suit ce que l'utilisateur et le réseau faisaient avant l'erreur.
Todd Gardner

En plus de la liste ci-dessus, log4sure.com est gratuit et dispose également d'une surveillance en temps réel des journaux. Vous pouvez également créer votre table de journal personnalisée
Bhavin


1
jsnlog.com est gratuit et open source .
stomie

12

Je viens de mettre en œuvre 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.onerroret d'encapsulation des gestionnaires d'événements jQuery et de la fonction onready avec une fonction de gestion des erreurs (voir: Suivi des erreurs JavaScript: Pourquoi window.onerror ne suffit pas ).

  • 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: détecte les erreurs d'événements jQuery dans tous les navigateurs.
  • Fonction jQuery ready: détecte les erreurs d'initialisation dans tous les navigateurs.

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

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

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


1
Une chance que ce code soit rendu disponible?
Luke

Malheureusement non: (car je ne travaille plus pour la société où j'ai créé ce code. Mais il ne s'agissait que d'environ 100 lignes de code et devrait être raisonnablement facile à recréer à partir des détails ci-dessus.
Karl


Je l' ai essayé, mais en gardant jquery dans le depencdency est une douleur et window.onerror suce pour le code minified et javascript qui est servi par cdns
Ankur Agarwal


0

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


TraceTool est mort?
Kiquenet

0

Si vous souhaitez enregistrer les erreurs côté client sur le serveur, vous devrez effectuer une sorte de traitement serveur. Le mieux serait d'avoir un service Web auquel vous pouvez accéder via JavaScript (AJAX) et que vous lui transmettez les informations de votre 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, une autre option serait d'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 Image (qui sont ensuite supprimées) car le navigateur essaiera de charger la source d'une image. Cependant, il contourne bien les appels JavaScript inter-domaines. Gardez à l'esprit que vous avez des problèmes si quelqu'un a désactivé les images;)


0

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


0

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

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


Le problème pour lequel nous n'utilisons pas JavaScript UnitTesting est qu'il y a trop de gens qui contribuent au site / contenu et qu'ils utilisent JavaScript (mais n'en avez pas la moindre idée!), Donc une solution générale serait meilleure.
MADMap
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.