Запис клієнтських помилок JavaScript на сервері [закрито]


97

Я працюю на веб-сайті ASP.NET, де у мене виникають проблеми з виявленням деяких помилок JavaScript лише при ручному тестуванні.

Чи є можливість зафіксувати всі помилки JavaScript на стороні клієнта та записати їх на Сервер, тобто в журнал подій (через веб-службу або щось подібне)?


Проблема, чому ми не використовуємо JavaScript UnitTesting, полягає в тому, що на сайт / вміст надто багато людей вносять вклад, і вони використовують JavaScript. Вміст - це те, про що ми (як розробники) не повинні дбати, але в коді є помилки. Тож загальне рішення було б кращим.
MADMap

Я припускаю, що ви не маєте на увазі середнього користувача (інакше це дірка XSS) ... але ... ви можете, можливо, ізолювати їх JS у спробі / лові, щоб принаймні це не впливало на вашу власну JS ... не знаючи динаміка сайту, я не знаю, допоможе це чи ні ...
Майк Стоун

Вміст
надійшов

Bugsnag автоматично реєструватиме ваші помилки та відображатиме їх на інформаційній панелі. Працює для .NET & JS.
Дон П

Відповіді:


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

Я щойно випустив серверний елемент керування, який допоможе вам це зробити, за адресою thecodepage.com/post/JavaScript-Error-Notifications.aspx
Габріель МакАдамс

2
Чи буде він нескінченно циклічно виходити з ладу в обробнику?
Jean-Philippe Leclerc

2
@ Jean-PhilippeLeclerc Так. І ще гірше, це зробить вашу кінцеву точку сервера, якщо ви коли-небудь потрапите в цикл помилок. Вам слід додати до цього функцію регулювання, щоб клієнт не потрапляв на сервер занадто швидко. Ось приклад цього із {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Тодд Гарднер,

Ви також можете зашифрувати маркер, що включає в себе ідентифікатор користувача, IP, невеликий випадковий рядок (для запобігання атакам відомого відкритого тексту, якщо ваш алгоритм шифрування швидкий, але слабкий), а також позначку часу та включити як змінну JS на сторінці. Потім його можна подати разом із звітом про помилку та перевірити, перш ніж дозволити його додавати до журналів. Це допомагає довести імовірність достовірності повідомлень про помилки та захищає від німих DoS-атак, але все одно не захистить вас від більш складних спроб DoS так, як це буде робити дроселювання.
mormegil

Ця річ може перевантажити ваш сервер, наприклад, якщо ви отримаєте помилку в setIntervalметоді. В Інтернеті доступно багато служб звітності про помилки JS. Оформити замовлення ErrLytics . Це також дає вам аналітику кожного дії користувача на вашому веб-сайті.
Вівек Маракана

28

Коротка відповідь: Так, це можливо.

Більш довга відповідь: Люди вже писали про те, як ви можете (принаймні частково) вирішити це питання, написавши власний код. Однак зверніть увагу, що там є служби, які, здається, переконалися, що код JS потрібен для роботи у багатьох браузерах. Я знайшов таке:

Я не можу говорити за жодну з цих послуг, оскільки я ще не пробував їх.


1
Зареєстровано на muscula.com. Сервіс виглядає дуже цікаво та легко інтегрується та використовується. Існує також бібліотека JavaScript github.com/csnover/TraceKit, яка дозволяє отримувати інформацію про винятки від клієнта, але ви повинні розробити власний механізм входу на сторону сервера. Цікаво, чи можна для цього використати Google Analytics
Максим Козленко

1
trackjs.com також, і він відстежує, що користувач та мережа робили до помилки.
Тодд Гарднер,

На додаток до наведеного вище списку, log4sure.com також безкоштовно, а також має моніторинг журналів у реальному часі. Ви також можете створити власну таблицю журналів
Bhavin,

erroralerts.com не знайдено
Kiquenet

1
jsnlog.com є безкоштовним та з відкритим кодом .
stomy

12

Я щойно реалізував реєстрацію помилок на стороні сервера на помилках javascript у проекті на роботі. Існує суміш застарілого коду та нового коду за допомогою jQuery .

Я використовую комбінацію window.onerrorта обтікання обробників подій jQuery та onready функції з функцією обробки помилок (див .: Відстеження помилок JavaScript: Чому window.onerror недостатньо ).

  • window.onerror: виявляє всі помилки в IE (і більшість помилок у Firefox), але нічого не робить у Safari та Opera.
  • Обробники подій jQuery: виявляє помилки події jQuery у всіх браузерах.
  • Функція jQuery ready: виявляє помилки ініціалізації у всіх браузерах.

Як тільки я виявив помилку, я додаю до неї деякі додаткові властивості (url, браузер тощо), а потім відправляю її назад на сервер за допомогою виклику ajax.

На сервері у мене є невелика сторінка, яка просто бере опубліковані аргументи і виводить їх у наш звичайний серверний журнал журналу.

Я хотів би відкрити для цього код (як плагін jQuery). Якщо хтось зацікавлений, повідомте мене, це допомогло б переконати босів!


1
Є шанс, що цей код стане доступним?
Лука

На жаль, ні :( оскільки я більше не працюю в компанії, де я створив цей код. Але це було лише близько 100 рядків коду, і його слід було б досить легко відтворити з деталей вище.
Карл,

1
це саме тут, хлопці: webcache.googleusercontent.com/…
Девін Г. Род,

Я спробував це, але зберігати jquery у депеденції - це біль і вікно. Вінер-помилка відсмоктує мініфікований код та javascript, які подаються через cdns
Ankur Agarwal,

2

Якщо ви використовуєте Google Analytics, ви можете реєструвати помилки javascript у подіях Google Analytics.

Дивіться цей додаток: http://siteapps.com/app/log_javascript_errors_with_ga-181

Сподіваюся, це допомагає.


2
Це посилання більше не працює. Ви можете знайти статтю про реєстрацію помилок Javascript за допомогою Google Analytics за адресою developers.google.com/analytics/devguides/collection/…
Мартін Омандер,

0

Також я рекомендую використовувати утиліту TraceTool , вона постачається з підтримкою JavaScript і дуже зручна для моніторингу JS.


TraceTool мертвий?
Кікенет,

0

Якщо ви хочете повернути помилки на стороні клієнта назад на сервер, вам доведеться виконати якусь обробку сервера. Найкраще було б мати веб-сервіс, до якого ви можете отримати доступ через JavaScript (AJAX), і ви передали йому інформацію про журнал помилок.

Не вирішує проблему на 100%, тому що якщо проблема пов'язана з веб-сервером, що розміщує веб-службу, у вас виникають проблеми, іншим варіантом буде надсилання інформації через стандартну сторінку через рядок запиту. Один із методів це робиться за допомогою динамічного генерування тегів зображення (які потім видаляються), оскільки браузер намагатиметься завантажити джерело зображення. Однак він добре обходить міждоменні дзвінки JavaScript. Майте на увазі, що у вас трапляються проблеми, якщо хтось вимикає зображення;)



0

Ви потенційно можете здійснити виклик Ajax на сервер за допомогою try / catch, але це, мабуть, приблизно найкраще, що ви можете зробити.

Чи можу я замість цього запропонувати модульне тестування JavaScript? Можливо, з JSUnit ?


Проблема, чому ми не використовуємо JavaScript UnitTesting, полягає в тому, що на сайт / вміст надто багато людей вносять свій внесок, і вони використовують JavaScript (але про це не мають уявлення!), Тому загальне рішення було б кращим.
MADMap
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.