Protokollieren von clientseitigen JavaScript-Fehlern auf dem Server [geschlossen]

97

Ich führe eine ASP.NET-Site aus, auf der ich Probleme habe, einige JavaScript-Fehler nur mit manuellen Tests zu finden.

Gibt es eine Möglichkeit, alle JavaScript-Fehler auf der Clientseite abzufangen und auf dem Server zu protokollieren, dh im EventLog (über Webservice oder ähnliches)?

MADMap
quelle
Das Problem, warum wir kein JavaScript UnitTesting verwenden, liegt darin, dass zu viele Personen zur Site / zum Inhalt beitragen und JavaScript verwenden. Der Inhalt ist nichts, worum wir (als Entwickler) uns kümmern sollten, aber es gibt Fehler im Code. Eine allgemeine Lösung wäre also besser.
MADMap
Ich nehme an, Sie meinen nicht, dass der durchschnittliche Benutzer einen Beitrag geleistet hat (sonst ist das XSS-Loch) ... aber ... Sie könnten möglicherweise ihre JS in try / catch isolieren, damit es zumindest Ihre eigene JS nicht beeinflusst ... ohne es zu wissen Die Dynamik der Seite, ich weiß nicht, ob dies helfen wird oder nicht ...
Mike Stone
Der Inhalt stammt von anderen Teams im Unternehmen, nicht von Benutzern, daher ist dies kein Sicherheitsrisiko
MADMap
Bugsnag protokolliert Ihre Fehler automatisch und zeigt sie in einem Dashboard an. Funktioniert für .NET & JS.
Don P

Antworten:

68

Sie können versuchen, einen eigenen Handler für das Ereignis onerror einzurichten und XMLHttpRequest zu verwenden, um dem Server mitzuteilen, was schief gelaufen ist. Da dies jedoch nicht Teil einer Spezifikation ist, ist die Unterstützung etwas unzuverlässig .

Hier ist ein Beispiel aus der Verwendung von XMLHttpRequest zum Protokollieren von JavaScript-Fehlern :

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
quelle
Ich habe gerade ein Server-Steuerelement veröffentlicht, das Ihnen dabei hilft: thecodepage.com/post/JavaScript-Error-Notifications.aspx
Gabriel McAdams
2
Wird es eine Endlosschleife geben, wenn es im Handler abstürzt?
Jean-Philippe Leclerc
2
@ Jean-PhilippeLeclerc Ja. Schlimmer noch, es wird Ihren Server-Endpunkt beschädigen, wenn Sie jemals in eine Fehlerschleife geraten. Sie sollten eine Drosselfunktion hinzufügen, um zu verhindern, dass ein Client zu schnell auf den Server trifft. Hier ist ein Beispiel dafür von {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Todd Gardner
Sie können auch ein Token verschlüsseln, das die ID, die IP-Adresse des Benutzers, eine kleine zufällige Zeichenfolge (um bekannte Klartextangriffe zu verhindern, wenn Ihr Verschlüsselungsalgorithmus schnell, aber schwach ist) und einen Zeitstempel enthält, und diese als JS-Variable in die Seite aufnehmen. Dies kann dann mit dem Fehlerbericht übermittelt und überprüft werden, bevor er an die Protokolle angehängt werden kann. Dies hilft beim Nachweis der wahrscheinlichen Authentizität von Fehlermeldungen und schützt vor dummen DoS-Angriffen, schützt Sie jedoch nicht vor komplexeren DoS-Versuchen, wie dies bei der Drosselung der Fall ist.
Mormegil
Diese Sache kann Ihren Server überfordern, z. B. wenn Sie einen Fehler in der setIntervalMethode erhalten. Im Web sind viele JS-Fehlerberichtsdienste verfügbar. Checkout ErrLytics . Außerdem erhalten Sie eine Analyse aller Benutzeraktionen auf Ihrer Website.
Vivek Marakana
28

Kurze Antwort: Ja, das ist möglich.

Längere Antwort: Die Leute haben bereits darüber geschrieben, wie Sie dieses Problem (zumindest teilweise) lösen können, indem Sie Ihren eigenen Code schreiben. Beachten Sie jedoch, dass es Dienste gibt, die anscheinend dafür gesorgt haben, dass der benötigte JS-Code in vielen Browsern funktioniert. Ich habe folgendes gefunden:

Ich kann für keinen dieser Dienste sprechen, da ich sie noch nicht ausprobiert habe.

Ztyx
quelle
1
Registriert bei muscula.com. Der Service sieht sehr interessant und einfach zu integrieren und zu verwenden. Es gibt auch die JavaScript-Bibliothek github.com/csnover/TraceKit , mit der Ausnahmeinformationen vom Client abgerufen werden können. Sie müssen jedoch einen eigenen serverseitigen Anmeldemechanismus entwickeln. Ich frage mich, ob Google Analytics dafür verwendet werden könnte
Maksym Kozlenko
1
trackjs.com verfolgt auch, was der Benutzer und das Netzwerk vor dem Fehler getan haben.
Todd Gardner
Zusätzlich zu der obigen Liste gibt es auch log4sure.com, das kostenlos ist und auch eine Echtzeitüberwachung von Protokollen bietet. Sie können auch Ihre benutzerdefinierte Protokolltabelle erstellen
Bhavin
erroralerts.com nicht gefunden
Kiquenet
1
jsnlog.com ist kostenlos und Open Source .
Stomy
12

Ich habe gerade die serverseitige Fehlerprotokollierung für Javascript-Fehler in einem Projekt bei der Arbeit implementiert. Mit jQuery gibt es eine Mischung aus Legacy-Code und neuem Code .

Ich verwende eine Kombination aus window.onerrorund umschließe die jQuery-Ereignishandler und eine Onready-Funktion mit einer Fehlerbehandlungsfunktion (siehe: JavaScript-Fehlerverfolgung: Warum window.onerror nicht ausreicht ).

  • window.onerror: fängt alle Fehler im IE ab (und die meisten Fehler in Firefox), tut aber nichts in Safari und Opera.
  • jQuery-Ereignishandler: Fängt jQuery-Ereignisfehler in allen Browsern ab.
  • jQuery-Ready-Funktion: Fängt Initialisierungsfehler in allen Browsern ab.

Sobald ich den Fehler entdeckt habe, füge ich ihm einige zusätzliche Eigenschaften hinzu (URL, Browser usw.) und sende ihn dann mit einem Ajax-Aufruf an den Server zurück.

Auf dem Server habe ich eine kleine Seite, die nur die veröffentlichten Argumente aufnimmt und sie an unser normales Server-Protokollierungsframework ausgibt.

Ich möchte den Code dafür als Quelle öffnen (als jQuery-Plugin). Wenn jemand interessiert ist, lass es mich wissen, es würde helfen, die Chefs zu überzeugen!

Karl
quelle
1
Gibt es eine Chance, dass dieser Code verfügbar gemacht wird?
Luke
Leider nicht :( da ich nicht mehr für die Firma arbeite, in der ich diesen Code erstellt habe. Aber es waren nur etwa 100 Codezeilen, und es sollte einigermaßen einfach sein, sie aus den obigen Details wiederherzustellen.
Karl
1
Es ist genau hier, Leute: webcache.googleusercontent.com/…
Devin G Rhode
Ich habe das versucht, aber jquery in der Abhängigkeit zu halten ist ein Schmerz und ein Fenster. Fehler saugt für minimierten Code und Javascript, das über cdns geliefert wird
Ankur Agarwal
0

Außerdem empfehle ich die Verwendung des Dienstprogramms TraceTool , das JavaScript unterstützt und für die JS-Überwachung sehr praktisch ist.

cleg
quelle
TraceTool ist tot?
Kiquenet
0

Wenn Sie die clientseitigen Fehler wieder auf dem Server protokollieren möchten, müssen Sie eine Art Serververarbeitung durchführen. Am besten ist es, einen Webdienst zu haben, auf den Sie über JavaScript (AJAX) zugreifen können und an den Sie Ihre Fehlerprotokollinformationen weitergeben.

Löst das Problem nicht zu 100%, da das Problem darin besteht, dass der Webserver den Webservice hostet, auf dem Sie Probleme haben. Sie können die Informationen auch über eine Standardseite über eine Abfragezeichenfolge senden. Eine Methode von Dies erfolgt über das dynamische Generieren von Bild-Tags (die dann entfernt werden), da der Browser versucht, die Quelle eines Bildes zu laden. Es geht jedoch gut um domänenübergreifende JavaScript-Aufrufe. Denken Sie daran, dass Sie in Schwierigkeiten sind, wenn jemand Bilder ausgeschaltet hat;)

Aaron Powell
quelle
0

Sie könnten möglicherweise von einem Versuch / Fang aus einen Ajax-Aufruf an den Server senden, aber das ist wahrscheinlich das Beste, was Sie tun können.

Darf ich stattdessen JavaScript-Unit-Tests vorschlagen? Möglicherweise mit JSUnit ?

Mike Stone
quelle
Das Problem, warum wir kein JavaScript UnitTesting verwenden, besteht darin, dass zu viele Personen zur Site / zum Inhalt beitragen und JavaScript verwenden (aber keine Ahnung davon haben!), Daher wäre eine allgemeine Lösung besser.
MADMap