Rejestrowanie błędów JavaScript po stronie klienta na serwerze [zamknięte]


97

Prowadzę witrynę ASP.NET, w której mam problemy ze znalezieniem błędów JavaScript tylko podczas ręcznego testowania.

Czy istnieje możliwość wyłapania wszystkich błędów JavaScript po stronie klienta i zalogowania ich na serwerze, tj. W dzienniku zdarzeń (przez usługę sieciową lub coś w tym rodzaju)?


Problem, dlaczego nie używamy JavaScript UnitTesting, polega na tym, że zbyt wiele osób wnosi wkład w Witrynę / Treść i używa JavaScript. Treść nie jest czymś, na czym powinniśmy (jako deweloperzy) dbać, ale w kodzie są błędy. Więc ogólne rozwiązanie byłoby lepsze.
MADMap

Zakładam, że nie masz na myśli przeciętnego użytkownika (inaczej jest to dziura XSS) ... ale ... może możesz odizolować ich JS w try / catch, więc przynajmniej nie wpłynie to na twój własny JS ... bez wiedzy dynamika strony, nie wiem, czy to pomoże, czy nie ...
Mike Stone

Treść pochodzi od innych zespołów w firmie, a nie od użytkowników, więc nie jest to zagrożenie bezpieczeństwa
MADMap

Bugsnag automatycznie zarejestruje twoje błędy i pokaże je na pulpicie nawigacyjnym. Działa dla .NET i JS.
Don P

Odpowiedzi:


68

Możesz spróbować skonfigurować własną procedurę obsługi zdarzenia onerror i użyć XMLHttpRequest, aby powiedzieć serwerowi, co poszło nie tak, jednak ponieważ nie jest to część żadnej specyfikacji, obsługa jest nieco niestabilna .

Oto przykład z używania XMLHttpRequest do rejestrowania błędów 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);
};

Właśnie wydałem kontrolę serwera, która pomaga ci to zrobić na thecodepage.com/post/JavaScript-Error-Notifications.aspx
Gabriel McAdams

2
Czy zapętli się w nieskończoność, jeśli ulegnie awarii w module obsługi?
Jean-Philippe Leclerc

2
@ Jean-PhilippeLeclerc Tak. Co gorsza, jeśli kiedykolwiek wpadniesz w pętlę błędów, zepsuje twój punkt końcowy serwera. Powinieneś dodać do tego funkcję dławienia, aby zapobiec zbyt szybkiemu atakowi klienta na serwer. Oto przykład z {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/ ...
Todd Gardner

Możesz także zaszyfrować token, który zawiera identyfikator użytkownika, adres IP, mały losowy ciąg (aby udaremnić ataki ze znanym tekstem jawnym, jeśli algorytm szyfrowania jest szybki, ale słaby) oraz znacznik czasu i dołączyć go jako zmienną JS na stronie. Można to następnie przesłać wraz z raportem o błędach i sprawdzić przed zezwoleniem na dołączenie go do dzienników. Pomaga to udowodnić prawdopodobną autentyczność komunikatu o błędzie i chroni przed głupimi atakami DoS, ale nadal nie chroni przed bardziej wyrafinowanymi próbami DoS, tak jak to zrobi ograniczenie.
mormegil

To może przytłoczyć twój serwer, np. Jeśli otrzymasz błąd w setIntervalmetodzie. W sieci dostępnych jest wiele usług raportowania błędów JS. Checkout ErrLytics . Zapewnia również analizę każdego działania użytkownika w Twojej witrynie.
Vivek Marakana

28

Krótka odpowiedź: tak, jest to możliwe.

Dłuższa odpowiedź: ludzie już pisali o tym, jak możesz (przynajmniej częściowo) rozwiązać ten problem, pisząc własny kod. Należy jednak pamiętać, że istnieją usługi, które wydają się zapewniać, że potrzebny kod JS działa w wielu przeglądarkach. Znalazłem następujące:

Nie mogę wypowiadać się w imieniu żadnej z tych usług, ponieważ jeszcze ich nie wypróbowałem.


1
Zarejestrowano na muscula.com. Serwis wygląda bardzo interesująco i jest łatwy w integracji i obsłudze. Istnieje również biblioteka JavaScript github.com/csnover/TraceKit, która pozwala uzyskać informacje o wyjątku od klienta, ale musisz opracować własny mechanizm logowania po stronie serwera. Zastanawiam się, czy można do tego wykorzystać Google Analytics
Maksym Kozlenko

1
trackjs.com i śledzi działania użytkownika i sieci przed wystąpieniem błędu.
Todd Gardner

Oprócz powyższej listy, log4sure.com jest również darmowy i ma również monitorowanie logów w czasie rzeczywistym. Możesz także utworzyć własną tabelę dziennika
Bhavin

erroralerts.com nie znaleziono
Kiquenet

1
jsnlog.com jest darmowy i open source .
stomia

12

Właśnie zaimplementowałem rejestrowanie błędów po stronie serwera na błędach javascript w projekcie w pracy. Istnieje mieszanka starego i nowego kodu używającego jQuery .

Używam kombinacji window.onerrori opakowując programy obsługi zdarzeń jQuery i funkcję onready z funkcją obsługi błędów (patrz: JavaScript Error Tracking: Why window.onerror Is Not Enough ).

  • window.onerror: łapie wszystkie błędy w IE (i większość błędów w Firefoksie), ale nic nie robi w Safari i Operze.
  • Programy obsługi zdarzeń jQuery: przechwytuje błędy zdarzeń jQuery we wszystkich przeglądarkach.
  • Funkcja gotowa do jQuery: wyłapuje błędy inicjalizacji we wszystkich przeglądarkach.

Po złapaniu błędu dodaję do niego kilka dodatkowych właściwości (adres URL, przeglądarka itp.), A następnie wysyłam go z powrotem na serwer za pomocą wywołania Ajax.

Na serwerze mam małą stronę, która po prostu pobiera przesłane argumenty i wyprowadza je do naszej normalnej struktury rejestrowania serwera.

Chciałbym otworzyć kod źródłowy tego (jako wtyczka jQuery). Jeśli ktoś jest zainteresowany, daj mi znać, pomogłoby to przekonać szefów!


1
Czy jest szansa, że ​​ten kod zostanie udostępniony?
Luke

Niestety nie :( ponieważ nie pracuję już dla firmy, w której utworzyłem ten kod. Ale było to tylko około 100 linii kodu i powinno być dość łatwe do odtworzenia z powyższych szczegółów.
Karl

1
to właśnie tutaj faceci: webcache.googleusercontent.com/...
Devin G Rhode

Próbowałem, ale utrzymanie jQuery w depencdency jest ból i window.onerror bani kodu minified i JavaScript, które serwowane jest przez CDN
Ankur Agarwal


0

Polecam również użycie narzędzia TraceTool , jest ono wyposażone w obsługę JavaScript i jest bardzo przydatne do monitorowania JS.


TraceTool nie żyje?
Kiquenet

0

Jeśli chcesz rejestrować błędy po stronie klienta z powrotem na serwerze, będziesz musiał wykonać jakiś rodzaj przetwarzania serwera. Najlepszym rozwiązaniem byłoby posiadanie usługi sieciowej, do której można uzyskać dostęp za pośrednictwem JavaScript (AJAX) i przekazywać do niej informacje z dziennika błędów.

Nie rozwiązuje problemu w 100%, ponieważ jeśli problem dotyczy serwera internetowego obsługującego usługę sieciową, w której masz kłopoty, inną opcją byłoby wysłanie informacji za pośrednictwem standardowej strony za pomocą ciągu zapytania. Jedna metoda robi to poprzez dynamiczne generowanie tagów obrazu (które są następnie usuwane), gdy przeglądarka będzie próbowała załadować źródło obrazu. Dobrze radzi sobie jednak z wywołaniami JavaScript między domenami. Pamiętaj, że masz kłopoty, jeśli ktoś ma wyłączone obrazy;)



0

Możesz potencjalnie wykonać wywołanie Ajax do serwera z próby / catch, ale to prawdopodobnie najlepsze, co możesz zrobić.

Czy mogę zamiast tego zaproponować testy jednostkowe JavaScript? Prawdopodobnie z JSUnit ?


Problem, dlaczego nie używamy JavaScript UnitTesting, polega na tym, że zbyt wiele osób wnosi wkład do Witryny / Treści i używają JavaScript (ale nie mają o tym pojęcia!), Więc ogólne rozwiązanie byłoby lepsze.
MADMap
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.