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)?

MADMap
la source
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);
};
Jonny Buchanan
la source
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.

Ztyx
la source
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
erroralerts.com introuvable
Kiquenet
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!

Karl
la source
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
1
c'est ici les gars: webcache.googleusercontent.com
Devin G Rhode
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
2

Si vous utilisez Google Analytics, vous pouvez enregistrer les 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 ça aide.

Leandro Lages
la source
2
Ce lien ne fonctionne plus. Vous pouvez trouver un article sur la journalisation des erreurs Javascript avec Google Analytics sur developer.google.com/analytics/devguides/collection/…
Martin Omander
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.

cleg
la source
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;)

Aaron Powell
la source
0

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

levelnis
la source
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 ?

Mike Stone
la source
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