Регистрация на стороне сервера сбоев Javascript на стороне клиента - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть большое сложное веб-приложение с тысячами строк Javascript.Существует небольшой набор прерывистых ошибок Javascript, о которых сообщают пользователи.

Я думаю, что это явление явления гонки - что-то не инициализировано правильно, и сбой Javascript приводит к тому, что «downstream» js не запускается.

В любом случае можно получить сбой выполнения Javascript для повторной регистрации на стороне сервера?

Все библиотеки журналов js, такие как Blackbird и Log4JavaScript , на стороне клиентатолько.

Ответы [ 2 ]

3 голосов
/ 21 декабря 2011

Я написал функцию удаленной регистрации ошибок, используя window.onerror, как предложено @ pimvdb

Err = {};

Err.Remoterr = {};

Err.Remoterr.onerror = function (msg, errorfileurl, lineno) {

    var jsonstring, response, pageurl, cookies;

    // Get some user input
    response = prompt("There has been an error. " +
                      "It has been logged and will be investigated.", 
                      "Put in comments (and e-mail or phone number for" + 
                      " response.)");

    // get some context of where and how the error occured
    // to make debugging easier
    pageurl = window.location.href;
    cookies = document.cookie;

    // Make the json message we are going to post
    // Could use JSON.stringify() here if you are sure that
    // JSON will have run when the error occurs
    // http://www.JSON.org/js.html
    jsonstring = "{\"set\": {\"jserr\": " +
        "{\"msg\": \""         + msg + "\", " + 
        "\"errorfileurl\": \"" + errorfileurl + "\", " +
        "\"pageurl\": \""      + pageurl + "\", " +
        "\"cookies\": \""      + cookies + "\", " +
        "\"lineno\": \""       + lineno + "\", " +
        "\"response\": \""     + response + "\"}}}";

    // Use the jquery cross-browser post
    // http://api.jquery.com/jQuery.post/
    // this assumes that no errors happen before jquery has initialised
    $.post("?jserr", jsonstring, null, "json");

    // I don't want the page to 'pretend' to work 
    // so I am going to return 'false' here
    // Returning 'true' will clear the error in the browser
    return false;
};

window.onerror = Err.Remoterr.onerror;

Я развернул это между тегами head и body веб-страницы.

Вы захотите изменить JSON и URL-адрес, по которому вы его публикуете, в зависимости от того, как вы собираетесь регистрировать данные на стороне сервера данных.

2 голосов
/ 25 апреля 2015

Взгляните на https://log4sure.com (раскрытие: я его создал) - но это действительно полезно, проверьте это и решите сами.Это позволяет вам регистрировать ошибки / события, а также позволяет создавать свою собственную таблицу журналов.Это также позволяет вам отслеживать ваши журналы в режиме реального времени.И самое приятное, его бесплатно.

Вы также можете использовать bower для его установки, используйте bower install log4sure

Код настройки очень прост:

// setup
var _logServer;

(function() {
  var ls = document.createElement('script');
  ls.type = 'text/javascript';
  ls.async = true;
  ls.src = 'https://log4sure.com/ScriptsExt/log4sure.min.js';
  var s = document.getElementsByTagName('script')[0];
  s.parentNode.insertBefore(ls, s);
  ls.onload = function() {
    // use your token here.
    _logServer = new LogServer("use-your-token-here");
  };
})();

//  example for logging text
_logServer.logText("your log message goes here.")

//example for logging error 
divide = function(numerator, divisor) {
    try {
      if (parseFloat(value) && parseFloat(divisor)) {
        throw new TypeError("Invalid input", "myfile.js", 12, {
          value: value,
          divisor: divisor
        });
      } else {
        if (divisor == 0) {
          throw new RangeError("Divide by 0", "myfile.js", 15, {
            value: value,
            divisor: divisor
          });
        }
      }
    } catch (e) {
      _logServer.logError(e.name, e.message, e.stack);

    }
  }
  // another use of logError in window.onerror
  // must be careful with window.onerror as you might be overwriting some one else's window.onerror functionality
  // also someone else can overwrite window.onerror.
window.onerror = function(msg, url, line, column, err) {
  // may want to check if url belongs to your javascript file
  var data = {
    url: url,
    line: line,
    column: column,

  }
  _logServer.logError(err.name, err.message, err.stack, data);

};

// example for custom logs
var foo = "some variable value";
var bar = "another variable value";
var flag = "false";
var temp = "yet another variable value";

_logServer.log(foo, bar, flag, temp);
...