Cattura tutti gli errori JavaScript e inviali al server


232

Mi chiedevo se qualcuno avesse esperienza nella gestione degli errori JavaScript a livello globale e li avesse inviati dal browser client a un server.

Penso che il mio punto sia abbastanza chiaro, voglio conoscere ogni eccezione, errore, errore di compilazione, ecc. Che si verifica sul lato client e inviarli al server per segnalarli.

Uso principalmente MooTools e head.js(per il lato JS) e Django per il lato server.


20
Non vedo perché questa domanda non sia chiara.
Michael Hilus,

3
Votato due volte per riaprire la domanda, ma senza fortuna. Non è del tutto chiaro perché questa domanda sia chiusa come poco chiara.
Muhammad Usman,

7
@ andrew-barber - se così tanti utenti trovano questa domanda abbastanza rilevante per votarla, forse se non ti è chiaro il problema è con te ??
Isapir,

5
Questa domanda non è solo chiara, ma è anche sottovalutata :)
Teoman shipahi

Risposte:


16

Di recente ho provato Sentry in produzione e funziona benissimo (JS e altre lingue come PHP)

1- È open source (puoi installarlo sul tuo server) 2- Puoi usare il piano gratuito (100 report / giorno)

O installalo sul tuo server: github.com/getsentry


Si noti che hanno un piano gratuito illimitato per le istituzioni educative
christianvuerings

8
Non sembra più essere open source, tutte le opzioni sono a pagamento?
David Cumps,

4
@DavidCumps Offrono ancora il servizio gratuito (versione di prova), ma hai solo 7 giorni di cronologia dei bug o puoi installarlo sul tuo server sin dal suo open source ( github.com/getsentry )
Tarek,

1
Google Tag Manager ha un listener di errori Javascript, forse vale la pena dare un'occhiata, soprattutto se stai già utilizzando GA
Adrian Gunawan

Dovresti anche controllare TrackJS per questo. È un servizio a pagamento, ma fornisce un sacco di contesto su come l'utente è entrato nella situazione di errore per il debug. Sono uno degli sviluppatori e ho risolto un sacco di bug :)
Todd Gardner,

318

Darei un'occhiata a window.onerror

Esempio:

window.onerror = function(message, url, lineNumber) {  
  //save error and send to server for example.
  return true;
};  

Tieni presente che la restituzione di true impedirà l'attivazione del gestore predefinito e la restituzione di false consentirà l'esecuzione del gestore predefinito.


9
È preferibile assegnare window.onerror preferibilmente prima che venga eseguito qualcos'altro. Quindi, ovunque tu voglia metterlo, assicurati solo che venga eseguito prima di qualsiasi altro codice / file js.
Mike Lewis,

17
Nota, Mozilla consiglia: "Nota che alcuni / molti eventi di errore non attivano window.onerror, devi ascoltarli in modo specifico".
Adam Naylor,

88
Sì, adoro il modo in cui dice alcuni / molti , molto descrittivo - grazie Mozilla.
Daniel Mendel,

5
Mozilla espone GlobalEventHandlers.onerror: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
roland

1
Cosa succede se il codice che gestisce window.onerror stesso genera un errore. Esiste la possibilità di un ciclo infinito?
Martin Brown,

15

Se il tuo sito Web utilizza Google Analytics, puoi fare quello che faccio:

window.onerror = function(message, source, lineno, colno, error) {
  if (error) message = error.stack;
  ga('send', 'event', 'window.onerror', message, navigator.userAgent);
}

Alcuni commenti sul codice sopra:

  • Per i browser moderni, viene registrata la traccia dello stack completo.
  • Per i browser meno recenti che non acquisiscono la traccia dello stack, viene invece registrato il messaggio di errore. (Principalmente versione iOS precedente nella mia esperienza).
  • Viene inoltre registrata la versione del browser dell'utente, in modo da poter vedere quali versioni del sistema operativo / browser generano quali errori. Ciò semplifica le priorità e i test dei bug.
  • Questo codice funziona se si utilizza Google Analytics con "analytics.js", in questo modo . Se invece si utilizza "gtag.js", in questo modo , è necessario modificare l'ultima riga della funzione. Vedi qui per i dettagli .

Una volta che il codice è attivo, ecco come visualizzi gli errori Javascript dei tuoi utenti:

  1. In Google Analytics, fai clic sulla Behaviorsezione e quindi sul Top Eventsrapporto.
  2. Otterrai un elenco di categorie di eventi. Fai clic window.onerrorsull'elenco.
  3. Vedrai un elenco di tracce dello stack Javascript e messaggi di errore. Aggiungi una colonna al rapporto per le versioni OS / browser dei tuoi utenti facendo clic sul Secondary dimensionpulsante e inserendo Event Labella casella di testo visualizzata.
  4. Il rapporto sarà simile allo screenshot qui sotto.
  5. Per tradurre le stringhe del sistema operativo / browser in descrizioni più leggibili dall'uomo, le copia e incollo in https://developers.whatismybrowser.com/useragents/parse/

inserisci qui la descrizione dell'immagine


3
Questo non intrappola tutti gli errori, basta provare a catturare i blocchi, anche se è una cosa interessante da spiegare e non penso che tu meriti i voti negativi.
Nick Steele,

Grazie, Nick! Ho aggiornato la mia risposta con un codice testato in battaglia che funziona bene sul mio sito Web e che cattura tutti gli errori, non solo quelli che intrappoli con try ... catch.
Martin Omander,

2

Non provare a utilizzare i servizi di terze parti, invece prova per il tuo.

I gestori degli errori possono individuare gli scenari seguenti,

  1. Tipo non catturato L'errore non può essere acquisito
  2. L'errore di riferimento non rilevato non può essere acquisito, ad esempio: var.click ()
  3. TypeError può essere acquisito
  4. L'errore di sintassi può essere acquisito
  5. L'errore di riferimento può essere acquisito

Per catturare errori Javascript:

window.addEventListener('error', function (e) {
  //It Will handle JS errors 
})

Per acquisire errori AngularJS:

app.config(function ($provide) {
$provide.decorator('$exceptionHandler', function ($delegate) {
   return function (exception, cause) {
       //It will handle AngualarJS errors
      }
   })
})

0

Inoltre, il servizio http://jslogger.com può aiutarti in questo:

Registra errori ed eventi Javascript nel cloud

da http://jslogger.com/features :

Da ora in poi puoi spiare tutti gli errori che interrompono l'esperienza utente del tuo sito. Ogni errore Javascript verrà rilevato e portato a te per il successivo debug.

DISCLAIMER: non affiliato con il servizio / azienda.


1
503 Servizio non disponibile
Rax

0

Puoi provare Atatus - Si tratta di un nuovo servizio di monitoraggio degli errori JavaScript insieme a Real User Monitoring (RUM) per le moderne app Web.

Non solo catturiamo gli errori, ma anche gli eventi dell'utente che hanno causato l'errore. Questo ti dà i passaggi per riprodurre l'errore alla tua fine.

Oltre alla cattura degli errori, catturiamo anche il tempo di caricamento della pagina e lo mostriamo in diverse prospettive: Geo, Browser, Drill down della pagina, Istogramma della pagina, Monitoraggio Ajax e Monitoraggio delle transazioni.

https://www.atatus.com/

Documenti disponibili: https://www.atatus.com/docs

Disclaimer: sono uno sviluppatore web di Atatus.


1
Ho integrato Ataus e poi ho provato qualcosa come foo.bar = '' che ha causato un'eccezione. Ma non riesco a vedere nulla nella dashboard di Atatus.
vmachacek,

Potresti inviarci un'email?
Fizer Khan,

5
Spina senza vergogna. Gli annunci dovrebbero essere limitati al lato destro.
Sarà il

0

La libreria non rilevata è un buon modo gratuito per catturare tutti gli errori JS, inclusi i rifiuti non gestiti.


-2

Potresti voler dare un'occhiata a questo nuovo servizio, http://rescuejs.com/ . https://bugsnag.com/

Ti permette di registrare tutti i tuoi errori javascript senza scrivere tu stesso il codice lato server. Tiene inoltre traccia delle versioni del browser e così via.

Non sono sicuro che li considererei "pronti per l'impresa" al 100%, ma vale sicuramente la pena provarli.


8
È stato chiuso. Se provi a registrarti ora ricevi il messaggio "Grazie per il tuo interesse, sfortunatamente Rescue.js non sta più lavorando attivamente".
Giorno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.