İstemci Tarafındaki JavaScript Hatalarını Sunucuda Günlüğe Kaydetme [kapalı]


98

Yalnızca manuel testle bazı JavaScript Hatalarını bulmakta sorun yaşadığım bir ASP.NET Sitesi çalıştırıyorum.

İstemci tarafındaki tüm JavaScript Hatalarını yakalama ve bunları Sunucuda, yani EventLog'da (Webservice veya benzeri bir şey aracılığıyla) kaydetme imkanı var mı?


JavaScript UnitTesting'i kullanmamamızın problemi, Siteye / İçeriğe katkıda bulunan çok fazla kişinin olması ve JavaScript kullanıyor olmalarıdır. İçerik, (geliştiriciler olarak) umursamamız gereken bir şey değil, ancak kodda hatalar var. Yani genel bir çözüm daha iyi olacaktır.
MADMap

Ortalama bir kullanıcının katkıda bulunduğunu kastetmediğinizi varsayıyorum (başka bir deyişle XSS deliği) ... ama ... belki JS'lerini try / catch'te izole edebilirsiniz, böylece en azından kendi JS'nizi etkilemez ... bilmeden sitenin dinamiği, bunun yardımcı olup olmayacağını bilmiyorum ...
Mike Stone

İçerik, kullanıcılardan değil, Şirketteki diğer Takımlardan geliyor, bu nedenle güvenlik riski değil
MADMap

Bugsnag , hatalarınızı otomatik olarak günlüğe kaydedecek ve bunları bir kontrol panelinde gösterecektir. .NET ve JS için çalışır.
Don P

Yanıtlar:


69

Onerror olayı için kendi işleyicinizi kurmayı deneyebilir ve sunucuya neyin yanlış gittiğini söylemek için XMLHttpRequest'i kullanabilirsiniz, ancak herhangi bir spesifikasyonun parçası olmadığı için destek biraz kesintili .

JavaScript hatalarını günlüğe kaydetmek için XMLHttpRequest kullanımından bir örnek :

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);
};

Bunu yapmanıza yardımcı olacak bir sunucu kontrolü yayınladım: thecodepage.com/post/JavaScript-Error-Notifications.aspx
Gabriel McAdams

2
İşleyicide çökerse sonsuz bir şekilde döngüye girecek mi?
Jean-Philippe Leclerc

2
@ Jean-PhilippeLeclerc Evet. Daha da kötüsü, herhangi bir hata döngüsüne girerseniz, sunucu uç noktanızı DoS yapar. Bir istemcinin sunucuya çok hızlı vurmasını önlemek için buna bir azaltma işlevi eklemelisiniz. İşte bunun bir örneği {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Todd Gardner

Ayrıca, kullanıcının kimliğini, IP'sini, küçük bir rastgele dizeyi (şifreleme algoritmanız hızlı ancak zayıfsa bilinen düz metin saldırılarını engellemek için) ve bir zaman damgasını içeren bir belirteci şifreleyebilir ve bunu sayfaya JS değişkeni olarak dahil edebilirsiniz. Bu daha sonra hata raporu ile birlikte gönderilebilir ve günlüklere eklenmesine izin verilmeden önce kontrol edilebilir. Bu, olası hata mesajının gerçekliğini kanıtlamaya yardımcı olur ve aptal DoS saldırılarından korur, ancak yine de sizi azaltmanın olacağı gibi daha karmaşık DoS girişimlerinden korumaz.
mormegil

Bu şey, örneğin setIntervalyöntemde hata alırsanız ve hata verirseniz sunucunuzu bunaltabilir . Web'de pek çok JS hata raporlama hizmeti mevcuttur. Checkout ErrLytics . Ayrıca, web sitenizdeki her kullanıcı eyleminin analizini de verir.
Vivek Marakana

29

Kısa cevap: Evet, mümkün.

Daha uzun cevap: İnsanlar kendi kodunuzu yazarak bu sorunu nasıl (en azından kısmen) çözebileceğiniz hakkında zaten yazmışlardır. Ancak, ihtiyaç duyulan JS kodunun birçok tarayıcıda çalışmasını sağlamış gibi görünen hizmetler olduğunu unutmayın. Aşağıdakileri buldum:

Henüz denemediğim için bu hizmetlerin hiçbiri adına konuşamıyorum.


1
Muscula.com'a kayıtlıdır. Hizmet çok ilginç ve entegre edilmesi ve kullanılması kolay görünüyor. Ayrıca, istemciden istisna bilgisi almanıza izin veren JavaScript kitaplığı github.com/csnover/TraceKit de vardır , ancak kendi sunucu tarafı oturum açma mekanizmanızı geliştirmeniz gerekir. Google Analytics bunun için kullanılabilir mi diye merak ediyorum
Maksym Kozlenko

1
trackjs.com ve kullanıcının ve ağın hatadan önce ne yaptığını izler.
Todd Gardner

Yukarıdaki listeye ek olarak, log4sure.com ücretsizdir ve ayrıca günlükleri gerçek zamanlı olarak izleyebilir . Ayrıca özel günlük tablonuzu da oluşturabilirsiniz
Bhavin



12

İşteki bir projede javascript hatalarını günlüğe kaydetme konusunda sunucu tarafı hatası uyguladım. JQuery kullanan eski kod ve yeni kodun bir karışımı var .

Bir kombinasyonunu kullanın window.onerror(: bakınız bir hata ele alma fonksiyonu ile ve jQuery olay işleyicileri ve onready fonksiyonunu sarma JavaScript Hata Takip: window.onerror Yetmez Neden ).

  • window.onerror: IE'deki tüm hataları (ve Firefox'taki çoğu hatayı) yakalar, ancak Safari ve Opera'da hiçbir şey yapmaz.
  • jQuery olay işleyicileri: tüm tarayıcılarda jQuery olay hatalarını yakalar.
  • jQuery ready işlevi: tüm tarayıcılarda başlatma hatalarını yakalar.

Hatayı yakaladıktan sonra, ona bazı ekstra özellikler (url, tarayıcı vb.) Eklerim ve ardından bir ajax çağrısı kullanarak sunucuya geri gönderirim.

Sunucuda, yayınlanan bağımsız değişkenleri alan ve bunları normal sunucu günlüğü çerçevemize çıkaran küçük bir sayfam var.

Bunun kodunu (bir jQuery eklentisi olarak) kaynak olarak açmak istiyorum. İlgilenen varsa bana haber ver, patronları ikna etmenin faydası olur!


1
Bu kodun kullanıma sunulması ihtimali var mı?
Luke

Maalesef hayır :( artık bu kodu oluşturduğum şirkette çalışmadığım için. Ancak bu yalnızca yaklaşık 100 satırlık bir koddu ve yukarıdaki ayrıntılardan yeniden oluşturulması makul ölçüde kolay olmalı.
Karl


Bunu denedim, ancak jquery'yi depencdency içinde tutmak bir acı ve pencere. Cdns
Ankur Agarwal


0

Ayrıca TraceTool yardımcı programını kullanmanızı öneririm , JavaScript desteği ile birlikte gelir ve JS izleme için çok kullanışlıdır.


TraceTool öldü mü?
Kiquenet

0

İstemci tarafı hatalarını sunucuya geri kaydetmek istiyorsanız, bir tür sunucu işlemi yapmanız gerekecektir. En iyi bahis, JavaScript (AJAX) aracılığıyla erişebileceğiniz ve hata günlüğü bilgilerinizi ona ilettiğiniz bir web hizmetine sahip olmaktır.

% 100 sorunu çözmez çünkü sorun, başınız belada olan web hizmetini barındıran web sunucusundaysa, başka bir seçenek de bilgileri standart bir sayfa aracılığıyla bir sorgu dizesi aracılığıyla göndermek olacaktır. tarayıcı bir görüntünün kaynağını yüklemeyi deneyip yükleyeceği için dinamik olarak Görüntü etiketleri (daha sonra kaldırılır) oluşturmak yoluyla bunu yapmaktır. Yine de, etki alanları arası JavaScript çağrılarını güzelce ele alır. Birisinin resimleri kapatması durumunda başınızın belada olduğunu unutmayın;)



0

Potansiyel olarak bir dene / yakala'dan sunucuya bir Ajax çağrısı yapabilirsiniz, ancak muhtemelen yapabileceğiniz en iyi şey budur.

Bunun yerine JavaScript birim testi önerebilir miyim? Muhtemelen ile JSUnit ?


JavaScript UnitTesting'i kullanmamamızın problemi, Siteye / İçeriğe katkıda bulunan çok fazla kişinin olması ve JavaScript kullanıyor olmalarıdır (ancak bu konuda hiçbir fikre sahip değiller!), Bu nedenle genel bir çözüm daha iyi olacaktır.
MADMap
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.