서버에서 클라이언트 측 JavaScript 오류 로깅 [닫힘]


97

수동 테스트만으로 JavaScript 오류를 찾는 데 문제가있는 ASP.NET 사이트를 운영하고 있습니다.

클라이언트 측에서 모든 JavaScript 오류를 포착하고 서버 (예 : 웹 서비스 또는 이와 유사한 것을 통해)에 기록 할 가능성이 있습니까?


JavaScript UnitTesting을 사용하지 않는 문제는 사이트 / 콘텐츠에 기여하는 사람이 너무 많고 JavaScript를 사용하고 있기 때문입니다. 콘텐츠는 우리가 (개발자로서) 신경 써야 할 것이 아니지만 코드에 실수가 있습니다. 따라서 일반적인 솔루션이 더 좋습니다.
MADMap

나는 당신이 평균적인 사용자가 기여했다는 것을 의미하지는 않는다고 가정합니다 (그렇지 않으면 XSS 구멍입니다) ...하지만 ... 당신은 아마도 그들의 JS를 try / catch에서 분리 할 수 ​​있으므로 적어도 자신의 JS에 영향을 미치지 않습니다 ... 사이트의 역 동성, 이것이 도움이 될지 아닐지 모르겠습니다 ...
Mike Stone

콘텐츠는 사용자가 아닌 회사의 다른 팀에서 가져온 것이므로 보안 위험이 없습니다
MADMap

Bugsnag 는 자동으로 오류를 기록하고 대시 보드에 표시합니다. .NET 및 JS에서 작동합니다.
Don P

답변:


68

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


2
핸들러에서 충돌이 발생하면 무한 반복됩니까?
Jean-Philippe Leclerc 2013 년

2
@ Jean-PhilippeLeclerc 예. 더 나쁜 것은 오류 루프에 빠지면 서버 엔드 포인트를 DoS합니다. 클라이언트가 서버에 너무 빨리 도달하는 것을 방지하려면 여기에 제한 기능을 추가해야합니다. 다음은 {Track : js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Todd Gardner

또한 사용자의 ID, IP, 작은 임의 문자열 (암호화 알고리즘이 빠르지 만 약한 경우 알려진 일반 텍스트 공격을 막기 위해) 및 타임 스탬프를 포함하는 토큰을 암호화하고이를 페이지에 JS 변수로 포함 할 수 있습니다. 그런 다음 오류 보고서와 함께 제출하고 로그에 추가하기 전에 확인할 수 있습니다. 이는 가능한 오류 메시지의 신뢰성을 입증하고 멍청한 DoS 공격으로부터 보호하는 데 도움이되지만, 스로틀 링 방식과 같은 더 정교한 DoS 시도로부터 사용자를 보호하지는 못합니다.
mormegil

예를 들어 setInterval방법에 오류가 발생하면 서버가 과부하 될 수 있습니다 . 웹에서 사용할 수있는 많은 JS 오류보고 서비스가 있습니다. Checkout ErrLytics . 또한 웹 사이트의 모든 사용자 행동에 대한 분석을 제공합니다.
Vivek Marakana

28

짧은 대답 : 예, 가능합니다.

더 긴 답변 : 사람들은 자신의 코드를 작성하여이 문제를 (적어도 부분적으로) 해결할 수있는 방법에 대해 이미 작성했습니다. 그러나 필요한 JS 코드가 많은 브라우저에서 작동하는지 확인한 것으로 보이는 서비스가 있다는 점에 유의하십시오. 다음을 찾았습니다.

아직 시도하지 않았기 때문에 이러한 서비스에 대해 말할 수 없습니다.


1
muscula.com에 등록되었습니다. 서비스는 매우 흥미롭고 통합 및 사용하기 쉽습니다. 클라이언트에서 예외 정보를 가져올 수있는 JavaScript 라이브러리 github.com/csnover/TraceKit 도 있지만 자체 서버 측 로그인 메커니즘을 개발해야합니다. Google 웹 로그 분석이 그에 사용될 수 있는지 궁금해
Maksym Kozlenko을

1
trackjs.com 도 마찬가지이며 오류가 발생하기 전에 사용자와 네트워크가 무엇을했는지 추적합니다.
Todd Gardner

위의 목록 외에도 log4sure.com 이 무료이며 실시간 로그 모니터링 기능도 있습니다. 사용자 지정 로그 테이블을 만들 수도 있습니다
Bhavin

erroralerts.com 를 찾을 수 없습니다
Kiquenet

1
jsnlog.com 은 무료이며 오픈 소스 입니다.
stomy

12

방금 직장에서 프로젝트의 자바 스크립트 오류에 대한 서버 측 오류 로깅을 구현했습니다. jQuery를 사용하는 레거시 코드와 새 코드가 혼합되어 있습니다.

window.onerrorjQuery 이벤트 핸들러와 onready 함수를 오류 처리 기능과 함께 조합 하여 래핑합니다 ( JavaScript 오류 추적 : 왜 window.onerror가 충분하지 않은지 참조 ).

  • window.onerror: IE의 모든 오류 (및 Firefox의 대부분의 오류)를 포착하지만 Safari 및 Opera에서는 아무 작업도 수행하지 않습니다.
  • jQuery 이벤트 핸들러 : 모든 브라우저에서 jQuery 이벤트 오류를 ​​포착합니다.
  • jQuery 준비 기능 : 모든 브라우저에서 초기화 오류를 포착합니다.

오류를 발견하면 URL, 브라우저 등의 추가 속성을 추가 한 다음 ajax 호출을 사용하여 서버에 다시 게시합니다.

서버에는 게시 된 인수를 가져 와서 정상적인 서버 로깅 프레임 워크로 출력하는 작은 페이지가 있습니다.

이 코드를 jQuery 플러그인으로 공개하고 싶습니다. 관심이있는 사람이 있으면 알려주세요. 상사를 설득하는 데 도움이 될 것입니다!


1
이 코드를 사용할 수있게 될 가능성이 있습니까?
Luke

안타깝게도 :( 내가 해당 코드를 만든 회사에서 더 이상 일하지 않기 때문에 코드가 100 줄 정도 밖에되지 않았고 위의 세부 정보에서 합리적으로 쉽게 재현 할 수 있어야합니다.
Karl

1
: 그것은 바로 여기에 사람의 webcache.googleusercontent.com/...
데빈 G로드

나는 것을하려고했으나 depencdency에 jQuery를 유지하는 고통과 window.onerror는 CDN을 통해 제공되고 축소 된 코드와 자바 스크립트에 대한 짜증 한
Ankur 아가 왈

2

Google Analytics를 사용하는 경우 Google Analytics 이벤트에 자바 스크립트 오류를 ​​기록 할 수 있습니다.

이 앱보기 : http://siteapps.com/app/log_javascript_errors_with_ga-181

도움이되기를 바랍니다.


2
해당 링크는 더 이상 작동하지 않습니다. 당신은에서 Google 웹 로그 분석과 자바 스크립트 오류를 로깅에 대한 기사를 찾을 수 있습니다 developers.google.com/analytics/devguides/collection/...
마틴 Omander

0

또한 TraceTool 유틸리티를 사용하는 것이 좋습니다. JavaScript 지원이 제공되며 JS 모니터링에 매우 편리합니다.


TraceTool 이 죽었습니까?
Kiquenet 2015

0

클라이언트 측 오류를 서버에 다시 기록하려면 일종의 서버 처리를 수행해야합니다. 가장 좋은 방법은 JavaScript (AJAX)를 통해 액세스 할 수있는 웹 서비스를 갖고 여기에 오류 로그 정보를 전달하는 것입니다.

문제가있는 웹 서비스를 호스팅하는 웹 서버에 문제가있는 경우 문제가 100 % 해결되지 않습니다. 다른 옵션은 쿼리 문자열을 통해 표준 페이지를 통해 정보를 보내는 것입니다. 브라우저가 이미지의 소스를로드하려고 시도하기 때문에 동적으로 생성 된 이미지 태그 (그런 다음 제거됨)를 통해 수행됩니다. 그래도 도메인 간 JavaScript 호출을 잘 처리합니다. 누군가 이미지가 꺼져 있으면 문제가 있음을 명심하십시오.)



0

try / catch에서 서버에 대한 Ajax 호출을 할 수 있지만 이것이 최선의 방법 일 것입니다.

대신 JavaScript 단위 테스트를 제안해도됩니까? 아마도 JSUnit으로 ?


우리가 JavaScript UnitTesting을 사용하지 않는 문제는 사이트 / 콘텐츠에 기여하는 사람이 너무 많고 JavaScript를 사용하고 있기 때문에 (하지만 이에 대한 단서가 없습니다!) 일반적인 솔루션이 더 좋을 것입니다.
MADMap
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.