Регистрация ошибок клиентского JavaScript на сервере [закрыто]

97

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

Есть ли возможность перехватить все ошибки JavaScript на стороне клиента и зарегистрировать их на сервере, то есть в журнале событий (через веб-сервис или что-то в этом роде)?

MADMap
источник
Проблема, по которой мы не используем JavaScript UnitTesting, заключается в том, что слишком много людей вносят свой вклад в Сайт / Контент и используют JavaScript. Контент - это не то, о чем мы (как разработчики) должны заботиться, но в коде есть ошибки. Так что общее решение было бы лучше.
MADMap,
Я предполагаю, что вы не имеете в виду, что средний пользователь внес свой вклад (иначе это XSS-дыра) ... но ... вы могли бы изолировать их JS в try / catch, чтобы это, по крайней мере, не повлияло на ваш собственный 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
Будет ли он бесконечно зацикливаться, если произойдет сбой в обработчике?
Жан-Филипп Леклерк
2
@ Жан-Филипп Леклерк. Да. И что еще хуже, это приведет к DoS-атаке на конечную точку вашего сервера, если вы когда-нибудь попадете в цикл ошибок. Вы должны добавить к этому функцию дросселирования, чтобы предотвратить слишком быстрое обращение клиента к серверу. Вот пример этого из {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Тодд Гарднер
Вы также можете зашифровать токен, который включает идентификатор пользователя, IP-адрес, небольшую случайную строку (для предотвращения атак с открытым текстом, если ваш алгоритм шифрования быстрый, но слабый) и метку времени, и включить ее в качестве переменной JS на странице. Затем его можно отправить вместе с отчетом об ошибке и проверить, прежде чем разрешить его добавление в журналы. Это помогает доказать вероятную подлинность сообщения об ошибке и защищает от глупых DoS-атак, но все же не защитит вас от более изощренных DoS-попыток, как это делает дросселирование.
mormegil 06
Это может привести к перегрузке вашего сервера, например, если вы получите ошибку в setIntervalметоде. В Интернете доступно множество сервисов отчетов об ошибках JS. Оформить заказ ErrLytics . Он также дает вам аналитику каждого действия пользователя на вашем сайте.
Вивек Маракана
28

Краткий ответ: да, это возможно.

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

Я не могу говорить ни об одной из этих услуг, поскольку еще не пробовал их.

Ztyx
источник
1
Зарегистрировано на muscula.com. Сервис выглядит очень интересным и простым в интеграции и использовании. Существует также библиотека JavaScript github.com/csnover/TraceKit, которая позволяет получать информацию об исключении от клиента, но вам необходимо разработать свой собственный механизм входа на стороне сервера. Интересно, можно ли для этого использовать Google Analytics?
Максим Козленко
1
trackjs.com , и он отслеживает, что делали пользователь и сеть до ошибки.
Тодд Гарднер
В дополнение к приведенному выше списку существует также бесплатный сайт log4sure.com , который также имеет мониторинг журналов в реальном времени. Вы также можете создать свою собственную таблицу журналов
Бхавин
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: обнаруживает ошибки инициализации во всех браузерах.

Как только я обнаружил ошибку, я добавляю к ней некоторые дополнительные свойства (URL, браузер и т. Д.), А затем отправляю их обратно на сервер с помощью вызова ajax.

На сервере у меня есть небольшая страница, которая просто принимает опубликованные аргументы и выводит их в нашу обычную структуру ведения журнала сервера.

Я хотел бы открыть исходный код для этого (как плагин jQuery). Если кому интересно, дайте знать, это поможет убедить начальство!

Карл
источник
1
Есть ли шанс, что этот код будет доступен?
Люк,
К сожалению, нет :(, так как я больше не работаю в компании, в которой я создал этот код. Но это было всего около 100 строк кода, и его должно быть достаточно легко воссоздать, исходя из приведенных выше деталей.
Карл,
1
это прямо здесь, ребята: webcache.googleusercontent.com/…
Девин Дж. Роуд,
Я пробовал это, но сохранение jquery в зависимости - это боль, и window.onerror отстой для минифицированного кода и javascript, который обслуживается через cdns,
Агарвал
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.

Cleg
источник
TraceTool мертв?
Kiquenet
0

Если вы хотите регистрировать ошибки на стороне клиента обратно на сервер, вам нужно будет выполнить какую-то обработку сервера. Лучше всего будет иметь веб-службу, к которой вы можете получить доступ через JavaScript (AJAX), и вы передадите ей информацию из журнала ошибок.

Не на 100% решает проблему, потому что если проблема связана с веб-сервером, на котором размещена веб-служба, у вас проблемы, другим вариантом будет отправка информации через стандартную страницу через строку запроса. это делается посредством динамической генерации тегов изображений (которые затем удаляются), когда браузер попытается загрузить источник изображения. Тем не менее, он прекрасно обходит междоменные вызовы JavaScript. Имейте в виду, что у вас проблемы, если у кого-то отключены изображения;)

Аарон Пауэлл
источник
0

Недавно я использовал Appfail , который фиксирует ошибки как asp.net, так и JavaScript.

levelnis
источник
0

Вы потенциально можете сделать Ajax-вызов сервера из try / catch, но, вероятно, это лучшее, что вы можете сделать.

Могу я предложить вместо этого модульное тестирование JavaScript? Возможно с JSUnit ?

Майк Стоун
источник
Проблема, по которой мы не используем JavaScript UnitTesting, заключается в том, что слишком много людей вносят свой вклад в Сайт / Контент и используют JavaScript (но понятия не имеют об этом!), Поэтому общее решение было бы лучше.
MADMap