Ghi nhật ký Lỗi JavaScript bên máy khách trên máy chủ [đã đóng]


97

Tôi đang chạy một Trang web ASP.NET nơi tôi gặp sự cố khi tìm thấy một số Lỗi JavaScript chỉ với kiểm tra thủ công.

Có khả năng bắt tất cả các lỗi JavaScript trên Clientside và đăng nhập chúng trên Server tức là trong EventLog (thông qua Webservice hoặc tương tự như vậy) không?


Vấn đề tại sao chúng tôi không sử dụng JavaScript UnitTesting là vì có quá nhiều người đóng góp cho Trang web / Nội dung và họ đang sử dụng JavaScript. Nội dung không phải là thứ mà chúng tôi (với tư cách là nhà phát triển) nên quan tâm, nhưng có những sai sót trong mã. Vì vậy, một giải pháp chung sẽ tốt hơn.
MADMap 23/09/08

Tôi cho rằng bạn không có nghĩa là người dùng trung bình đã đóng góp (khác đó là lỗ hổng XSS) ... nhưng ... bạn có thể tách JS của họ trong try / catch để ít nhất nó không ảnh hưởng đến JS của riêng bạn ... mà không cần biết động của trang web, tôi không biết liệu điều này có giúp ích được gì hay không ...
Mike Stone

Nội dung là từ các Nhóm khác trong Công ty, không phải từ người dùng nên nó không phải là rủi ro về bảo mật
MADMap 23/09/08

Bugsnag sẽ tự động ghi lại các lỗi của bạn và hiển thị chúng trong trang tổng quan. Hoạt động cho .NET & JS.
Don P

Câu trả lời:


68

Bạn có thể thử thiết lập trình xử lý của riêng mình cho sự kiện onerror và sử dụng XMLHttpRequest để thông báo cho máy chủ biết điều gì đã xảy ra, tuy nhiên vì nó không phải là một phần của bất kỳ thông số kỹ thuật nào nên việc hỗ trợ hơi khó khăn .

Đây là một ví dụ từ Sử dụng XMLHttpRequest để ghi lại các lỗi 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);
};

Tôi vừa phát hành một điều khiển máy chủ giúp bạn thực hiện việc này tại thecodepage.com/post/JavaScript-Error-Notifications.aspx
Gabriel McAdams

2
Nó sẽ lặp lại nội bộ nếu nó bị lỗi trong trình xử lý?
Jean-Philippe Leclerc,

2
@ Jean-PhilippeLeclerc Có. Và tệ hơn, nó sẽ DoS điểm cuối máy chủ của bạn nếu bạn rơi vào vòng lặp lỗi. Bạn nên thêm chức năng điều chỉnh để ngăn máy khách đánh máy chủ quá nhanh. Dưới đây là một ví dụ về điều này từ {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/...
Todd Gardner

Bạn cũng có thể mã hóa mã thông báo bao gồm ID, IP của người dùng, một chuỗi ngẫu nhiên nhỏ (để ngăn chặn các cuộc tấn công văn bản rõ ràng đã biết nếu thuật toán mã hóa của bạn nhanh nhưng yếu), dấu thời gian và bao gồm nó dưới dạng biến JS trong trang. Sau đó, điều này có thể được gửi cùng với báo cáo lỗi và được kiểm tra trước khi cho phép nó được thêm vào nhật ký. Điều này giúp chứng minh tính xác thực của thông báo lỗi có thể xảy ra và bảo vệ khỏi các cuộc tấn công DoS ngu ngốc, nhưng vẫn sẽ không bảo vệ bạn khỏi những nỗ lực DoS phức tạp hơn theo cách mà nó sẽ làm.
mormegil

Điều này có thể áp đảo máy chủ của bạn, ví dụ như nếu bạn nhận được và lỗi trong setIntervalphương pháp. Có rất nhiều dịch vụ báo cáo lỗi JS có sẵn trên web. Kiểm tra ErrLytics . Nó cũng cung cấp cho bạn phân tích về mọi hành động của người dùng trên trang web của bạn.
Vivek Marakana

28

Câu trả lời ngắn gọn: Có, nó có thể.

Câu trả lời dài hơn: Mọi người đã viết về cách bạn có thể (ít nhất một phần) giải quyết vấn đề này bằng cách viết mã của riêng bạn. Tuy nhiên, hãy lưu ý rằng có những dịch vụ có vẻ như đã đảm bảo rằng mã JS cần thiết hoạt động trong nhiều trình duyệt. Tôi đã tìm thấy những thứ sau:

Tôi không thể nói cho bất kỳ dịch vụ nào trong số này vì tôi chưa thử chúng.


1
Đã đăng ký với muscula.com. Dịch vụ trông rất thú vị và dễ dàng tích hợp và sử dụng. Ngoài ra còn có thư viện JavaScript github.com/csnover/TraceKit cho phép lấy thông tin ngoại lệ từ máy khách, nhưng bạn phải phát triển cơ chế đăng nhập phía máy chủ của riêng mình. Tôi tự hỏi nếu Google Analytics có thể được sử dụng cho điều đó
Maksym Kozlenko

1
trackjs.com cũng vậy, nó theo dõi những gì người dùng và mạng đã làm trước khi xảy ra lỗi.
Todd Gardner

Ngoài danh sách trên còn có, log4sure.com miễn phí và cũng có chức năng giám sát nhật ký theo thời gian thực. Bạn cũng có thể tạo bảng nhật ký tùy chỉnh của mình
Bhavin

erroralerts.com không tìm thấy
Kiquenet

1
jsnlog.commã nguồn mở miễn phí .
stomy

12

Tôi vừa thực hiện ghi nhật ký lỗi phía máy chủ về lỗi javascript trên một dự án tại nơi làm việc. Có một hỗn hợp mã kế thừa và mã mới bằng cách sử dụng jQuery .

Tôi sử dụng kết hợp window.onerrorvà gói các trình xử lý sự kiện jQuery và hàm onready với một hàm xử lý lỗi (xem: Theo dõi lỗi JavaScript: Tại sao window.onerror là không đủ ).

  • window.onerror: bắt tất cả các lỗi trong IE (và hầu hết các lỗi trong Firefox), nhưng không làm được gì trong Safari và Opera.
  • Trình xử lý sự kiện jQuery: bắt lỗi sự kiện jQuery trong tất cả các trình duyệt.
  • Hàm sẵn sàng của jQuery: bắt lỗi khởi tạo trong tất cả các trình duyệt.

Khi tôi đã gặp lỗi, tôi thêm một số thuộc tính bổ sung vào nó (url, trình duyệt, v.v.) và sau đó đăng nó trở lại máy chủ bằng lệnh gọi ajax.

Trên máy chủ, tôi có một trang nhỏ chỉ lấy các đối số đã đăng và xuất chúng ra khung ghi nhật ký máy chủ bình thường của chúng tôi.

Tôi muốn mở mã nguồn cho cái này (dưới dạng một plugin jQuery). Nếu ai quan tâm hãy cho tôi biết, nó sẽ giúp thuyết phục các ông chủ!


1
Bất kỳ cơ hội nào mà mã này sẽ được cung cấp?
Luke

Rất tiếc là không :( vì tôi không còn làm việc cho công ty mà tôi đã tạo ra mã đó nữa. Nhưng nó chỉ có khoảng 100 dòng mã và sẽ dễ tạo lại từ các chi tiết ở trên.
Karl

1
đó là ngay tại đây chàng trai: webcache.googleusercontent.com/...
Devin G Rhode

Tôi đã cố gắng đó, nhưng giữ jquery trong depencdency là một nỗi đau và window.onerror hút cho mã được rút gọn và javascript được phục vụ qua CDN
Ankur Agarwal


0

Ngoài ra, tôi khuyên bạn nên sử dụng tiện ích TraceTool , nó đi kèm với hỗ trợ JavaScript và rất tiện dụng để theo dõi JS.


TraceTool đã chết?
Kiquenet

0

Nếu bạn muốn ghi các lỗi phía máy khách trở lại máy chủ, bạn sẽ phải thực hiện một số loại xử lý máy chủ. Đặt cược tốt nhất là có một dịch vụ web mà bạn có thể truy cập thông qua JavaScript (AJAX) và bạn chuyển thông tin nhật ký lỗi của mình vào đó.

Không giải quyết được 100% vấn đề vì nếu sự cố xảy ra với máy chủ web lưu trữ dịch vụ web mà bạn đang gặp sự cố, thì tùy chọn khác của bạn là gửi thông tin qua trang chuẩn thông qua chuỗi truy vấn, Một phương pháp thực hiện điều đó thông qua việc tạo động các thẻ Hình ảnh (sau đó sẽ bị xóa) vì trình duyệt sẽ thử và tải nguồn của hình ảnh. Mặc dù vậy, nó xoay quanh các cuộc gọi JavaScript giữa nhiều miền một cách độc đáo. Hãy nhớ rằng bạn sẽ gặp rắc rối nếu ai đó đã tắt hình ảnh;)


0

Gần đây tôi đang sử dụng Appfail , ứng dụng này bắt được cả lỗi asp.net và JavaScript


0

Bạn có thể thực hiện một cuộc gọi Ajax tới máy chủ từ một lần thử / bắt, nhưng đó có lẽ là điều tốt nhất bạn có thể làm.

Tôi có thể đề xuất thử nghiệm đơn vị JavaScript thay thế không? Có thể với JSUnit ?


Vấn đề tại sao chúng tôi không sử dụng JavaScript UnitTesting là vì có quá nhiều người đóng góp cho Trang web / Nội dung và họ đang sử dụng JavaScript (nhưng không có manh mối về nó!) Nên một giải pháp chung sẽ tốt hơn.
MADMap 23/09/08
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.