การบันทึกข้อผิดพลาด JavaScript Clientside บนเซิร์ฟเวอร์ [ปิด]


98

ฉันใช้งานไซต์ ASP.NET ที่ฉันมีปัญหาในการค้นหาข้อผิดพลาด JavaScript บางอย่างด้วยการทดสอบด้วยตนเอง

มีความเป็นไปได้หรือไม่ที่จะตรวจจับข้อผิดพลาด JavaScript ทั้งหมดบนไคลเอนต์ไซด์และบันทึกบนเซิร์ฟเวอร์เช่นใน EventLog (ผ่านทางเว็บไซต์หรืออะไรทำนองนั้น)


ปัญหาที่เราไม่ใช้ JavaScript UnitTesting เนื่องจากมีผู้คนจำนวนมากเกินไปที่ให้การสนับสนุนไซต์ / เนื้อหาและพวกเขากำลังใช้ JavaScript เนื้อหาไม่ใช่สิ่งที่เรา (ในฐานะนักพัฒนา) ควรใส่ใจ แต่มีข้อผิดพลาดในโค้ด ดังนั้นวิธีแก้ปัญหาทั่วไปจะดีกว่า
MADMap

ฉันคิดว่าคุณไม่ได้หมายถึงผู้ใช้ทั่วไปที่มีส่วนร่วม (อย่างอื่นนั่นคือรู XSS) ... แต่ ... คุณอาจแยก JS ของพวกเขาในการลอง / จับดังนั้นอย่างน้อยก็ไม่ส่งผลกระทบต่อ JS ของคุณเอง ... โดยไม่รู้ตัว ไดนามิกของไซต์ฉันไม่รู้ว่าสิ่งนี้จะช่วยได้หรือไม่ ...
Mike Stone

เนื้อหามาจากทีมอื่นใน บริษัท ไม่ใช่จากผู้ใช้ดังนั้นจึงไม่เสี่ยงต่อความปลอดภัย
MADMap

Bugsnagจะบันทึกข้อผิดพลาดของคุณโดยอัตโนมัติและแสดงในแดชบอร์ด ใช้งานได้กับ. NET & JS
Don P

คำตอบ:


69

คุณอาจจะลองตั้งค่าการจัดการของคุณเองสำหรับเหตุการณ์ onerrorและใช้ XMLHttpRequest จะบอกเซิร์ฟเวอร์สิ่งที่ผิดไป แต่เพราะมันไม่ได้เป็นส่วนหนึ่งของข้อกำหนดใด ๆ ที่สนับสนุนค่อนข้างเป็นขุย

นี่คือตัวอย่างจากการใช้ XMLHttpRequest เพื่อบันทึกข้อผิดพลาด 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);
};

ฉันเพิ่งเปิดตัวการควบคุมเซิร์ฟเวอร์ที่ช่วยให้คุณทำสิ่งนี้ได้ที่thecodepage.com/post/JavaScript-Error-Notifications.aspx
Gabriel McAdams

2
มันจะวนซ้ำไม่สิ้นสุดถ้ามันขัดข้องในตัวจัดการ?
Jean-Philippe Leclerc

2
@ Jean-PhilippeLeclerc ใช่ และที่แย่กว่านั้นมันจะทำให้จุดสิ้นสุดของเซิร์ฟเวอร์ของคุณตกอยู่ในห่วงข้อผิดพลาด คุณควรเพิ่มฟังก์ชันการควบคุมปริมาณเพื่อป้องกันไม่ให้ไคลเอ็นต์เข้าสู่เซิร์ฟเวอร์เร็วเกินไป นี่คือตัวอย่างจาก {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Todd Gardner

นอกจากนี้คุณยังสามารถเข้ารหัสโทเค็นที่มี ID ผู้ใช้ IP สตริงสุ่มขนาดเล็ก (เพื่อป้องกันการโจมตีข้อความธรรมดาหากอัลกอริทึมการเข้ารหัสของคุณเร็ว แต่อ่อนแอ) และการประทับเวลาและรวมสิ่งนั้นเป็นตัวแปร JS ในหน้า จากนั้นสามารถส่งรายงานข้อผิดพลาดและตรวจสอบก่อนที่จะอนุญาตให้ผนวกเข้ากับบันทึก สิ่งนี้ช่วยพิสูจน์ความถูกต้องของข้อความแสดงข้อผิดพลาดที่เป็นไปได้และปกป้องจากการโจมตี DoS ที่โง่เขลา แต่ก็ยังไม่สามารถปกป้องคุณจาก DoS ที่ซับซ้อนกว่านี้ได้ตามที่การควบคุมปริมาณจะทำได้
mormegil

สิ่งนี้สามารถครอบงำเซิร์ฟเวอร์ของคุณได้เช่นหากคุณได้รับและข้อผิดพลาดในsetIntervalวิธีการ มีบริการรายงานข้อผิดพลาด JS มากมายบนเว็บ กร้าErrLytics นอกจากนี้ยังให้การวิเคราะห์ทุกการกระทำของผู้ใช้บนเว็บไซต์ของคุณ
Vivek Marakana

29

คำตอบสั้น ๆ :ใช่เป็นไปได้

คำตอบที่ยาวกว่า:ผู้คนได้เขียนถึงวิธีที่คุณสามารถ (อย่างน้อยบางส่วน) แก้ปัญหานี้ด้วยการเขียนโค้ดของคุณเอง อย่างไรก็ตามโปรดทราบว่ามีบริการที่ดูเหมือนจะทำให้แน่ใจว่ารหัส JS ที่ต้องการใช้งานได้ในหลายเบราว์เซอร์ ฉันพบสิ่งต่อไปนี้:

ฉันไม่สามารถพูดถึงบริการใด ๆ เหล่านี้ได้เนื่องจากฉันยังไม่ได้ลองใช้


1
ลงทะเบียนกับ muscula.com บริการดูน่าสนใจมากและง่ายต่อการรวมและใช้งาน นอกจากนี้ยังมีไลบรารี JavaScript github.com/csnover/TraceKitซึ่งอนุญาตให้รับข้อมูลข้อยกเว้นจากไคลเอนต์ แต่คุณต้องพัฒนากลไกการล็อกอินฝั่งเซิร์ฟเวอร์ของคุณเอง ฉันสงสัยว่าจะใช้ Google Analytics ได้หรือไม่
Maksym Kozlenko

1
trackjs.comด้วยและติดตามสิ่งที่ผู้ใช้และเครือข่ายกำลังทำอยู่ก่อนเกิดข้อผิดพลาด
ทอดด์การ์ดเนอร์

นอกจากรายการด้านบนแล้วยังมี log4sure.comฟรีและยังมีการตรวจสอบบันทึกแบบเรียลไทม์อีกด้วย คุณยังสามารถสร้างตารางบันทึกแบบกำหนดเองได้
Bhavin

erroralerts.comไม่พบ
Kiquenet

1
jsnlog.comฟรีและโอเพนซอร์ส
Stomy

12

ฉันเพิ่งติดตั้งการบันทึกข้อผิดพลาดฝั่งเซิร์ฟเวอร์เกี่ยวกับข้อผิดพลาดจาวาสคริปต์ในโครงการที่ทำงาน มีส่วนผสมของรหัสเดิมและรหัสใหม่โดยใช้เป็นjQuery

ฉันใช้การรวมwindow.onerrorและการรวมตัวจัดการเหตุการณ์ jQuery และฟังก์ชัน onready กับฟังก์ชันการจัดการข้อผิดพลาด (ดู: การติดตามข้อผิดพลาดของ JavaScript: เหตุใด window.onerror จึงไม่เพียงพอ )

  • window.onerror: ตรวจจับข้อผิดพลาดทั้งหมดใน IE (และข้อผิดพลาดส่วนใหญ่ใน Firefox) แต่ไม่ทำอะไรเลยใน Safari และ Opera
  • ตัวจัดการเหตุการณ์ jQuery: ตรวจจับข้อผิดพลาดของเหตุการณ์ jQuery ในเบราว์เซอร์ทั้งหมด
  • ฟังก์ชัน jQuery ready: ตรวจจับข้อผิดพลาดในการเริ่มต้นในเบราว์เซอร์ทั้งหมด

เมื่อฉันพบข้อผิดพลาดฉันเพิ่มคุณสมบัติพิเศษบางอย่างลงไป (url, เบราว์เซอร์ ฯลฯ ) จากนั้นโพสต์กลับไปที่เซิร์ฟเวอร์โดยใช้การโทร ajax

บนเซิร์ฟเวอร์ฉันมีเพจเล็ก ๆ ซึ่งใช้เพียงแค่อาร์กิวเมนต์ที่โพสต์และส่งออกไปยังเฟรมเวิร์กการบันทึกเซิร์ฟเวอร์ปกติของเรา

ฉันต้องการเปิดรหัสสำหรับสิ่งนี้ (เป็นปลั๊กอิน jQuery) หากใครสนใจแจ้งให้เราทราบมันจะช่วยโน้มน้าวผู้บังคับบัญชา!


1
มีโอกาสที่รหัสนี้จะพร้อมใช้งานหรือไม่?
ลุค

น่าเสียดายที่ไม่ใช่ :( เนื่องจากฉันไม่ได้ทำงานให้กับ บริษัท ที่ฉันสร้างรหัสนั้นอีกต่อไป แต่มันมีโค้ดประมาณ 100 บรรทัดเท่านั้นและควรจะสร้างใหม่ได้ง่ายพอสมควรจากรายละเอียดด้านบน
Karl

1
อยู่ตรงนี้แหละครับ
Devin G Rhode

ฉันได้ลองใช้แล้ว แต่การเก็บ jquery ไว้ใน Depencdency นั้นเป็นความเจ็บปวดและหน้าต่าง Onerror ใช้โค้ด minified และ javascript ที่ให้บริการผ่าน cdns
Ankur Agarwal

2

หากคุณใช้ Google Analytics คุณสามารถบันทึกข้อผิดพลาดของจาวาสคริปต์ลงในเหตุการณ์ของ Google Analytics

ดูแอปนี้: http://siteapps.com/app/log_javascript_errors_with_ga-181

หวังว่าจะช่วยได้


2
ลิงก์นั้นใช้งานไม่ได้อีกต่อไป คุณสามารถค้นหาบทความเกี่ยวกับการบันทึกข้อผิดพลาด Javascript ด้วย Google Analytics ได้ที่developers.google.com/analytics/devguides/collection/…
Martin Omander

0

นอกจากนี้ฉันขอแนะนำให้ใช้ยูทิลิตี้TraceToolมันมาพร้อมกับการสนับสนุน JavaScript และมีประโยชน์มากสำหรับการตรวจสอบ JS


TraceToolตายแล้ว?
Kiquenet

0

หากคุณต้องการบันทึกข้อผิดพลาดฝั่งไคลเอ็นต์กลับไปที่เซิร์ฟเวอร์คุณจะต้องดำเนินการประมวลผลเซิร์ฟเวอร์บางประเภท ทางออกที่ดีที่สุดคือการมีบริการเว็บที่คุณสามารถเข้าถึงผ่าน JavaScript (AJAX) และคุณส่งข้อมูลบันทึกข้อผิดพลาดของคุณไป

ไม่สามารถแก้ปัญหาได้ 100% หากปัญหาเกิดจากเว็บเซิร์ฟเวอร์ที่โฮสต์บริการเว็บที่คุณมีปัญหาคุณมีทางเลือกอื่นในการส่งข้อมูลผ่านทางเพจมาตรฐานผ่านสตริงการสืบค้นวิธีหนึ่งของ การทำเช่นนั้นคือการสร้างแท็กรูปภาพแบบไดนามิก (ซึ่งจะถูกลบออก) เนื่องจากเบราว์เซอร์จะพยายามโหลดแหล่งที่มาของรูปภาพ แม้ว่าจะได้รับการเรียกใช้ JavaScript ข้ามโดเมนก็ตาม โปรดทราบว่าคุณกำลังประสบปัญหาหากมีคนปิดภาพ;)



0

คุณสามารถโทร Ajax ไปยังเซิร์ฟเวอร์ได้จากการลอง / จับ แต่นั่นอาจเป็นวิธีที่ดีที่สุดที่คุณสามารถทำได้

ฉันขอแนะนำการทดสอบหน่วย JavaScript แทนได้ไหม เป็นไปได้ด้วยJSUnit ?


ปัญหาที่เราไม่ใช้ JavaScript UnitTesting เป็นเพราะมีคนจำนวนมากเกินไปที่ให้การสนับสนุนไซต์ / เนื้อหาและพวกเขาใช้ JavaScript (แต่ไม่มีเงื่อนงำเกี่ยวกับเรื่องนี้!) ดังนั้นวิธีแก้ปัญหาทั่วไปจะดีกว่า
MADMap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.