2011-12-21 5 views
4

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

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

Есть ли все-таки, чтобы выполнить сбой Javascript для регистрации на стороне сервера?

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

+2

Если ошибки вызывают ошибки, которые будут выброшенные , вы можете посмотреть 'window.onerror' и отправить запрос ajax внутри обработчика (посылка аргумента события). Это, конечно, не сработает, если приложение действительно выйдет из строя (как в случае сбоя браузера). – pimvdb

+0

@pimvdb, который должен быть ответом :) –

+0

@JaniHartikainen Я согласен –

ответ

3

Я написал функцию протоколирования ошибок, используя удаленный 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; 

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

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

+0

+1 Если вы используете jQuery, вы также можете передать объект вместо messing с экранированием и т. Д. (Просто для ясности). Он автоматически сериализует его. – pimvdb

+0

@pimvdb - подарок, который продолжает давать. В нашей базе кода используется JSON.stringify(). Я хотел, чтобы код ошибки был как можно более тонким, поэтому я сделал это вручную :( –

2

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

Вы также можете использовать беседку, чтобы установить его, используйте становой установить 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);

Смежные вопросы