Как вы регистрируете ошибки (исключения) в своих приложениях ASP.NET?

Я ищу лучший способ регистрировать ошибки в приложении ASP.NET. Я хочу получать электронные письма при возникновении ошибок в моем приложении с подробной информацией об исключении и текущем запросе.

В моей компании у нас был собственный ErrorMailer, улавливающий все в Global.asax Application_Error. Это было нормально, но не очень гибко и не настраивалось.

Недавно мы перешли на NLog. Он гораздо более настраиваемый, мы можем определять различные цели для ошибок, фильтровать их, буферизовать их (еще не пробовали). Это очень хорошее улучшение.

Но недавно я обнаружил, что для этой цели в структуре .Net есть целое пространство имен: System.Web.Management, и его можно настроить в разделе healthMonitoring файла web.config.

Вы когда-нибудь работали с мониторингом работоспособности .Net? Каково ваше решение для регистрации ошибок?

Ответов (8)

Решение

Я использую elmah . У него есть несколько действительно хороших функций, и вот статья об этом CodeProject . Я думаю, что команда StackOverflow также использует elmah!

Мы используем EnterpriseLibrary.ExceptionHandling.Logging. Мне он нравится немного больше, чем log4net, потому что мы не только полностью контролируем ведение журнала, но также можем контролировать решение Throw / NoThrow в конфигурации.

Моя команда использует log4net от Apache. Он довольно легкий и простой в настройке. Лучше всего то, что он полностью настраивается из файла web.config, поэтому, как только у вас есть ловушки в настройке кода, вы можете полностью изменить способ ведения журнала, просто изменив файл web.config.

log4net поддерживает ведение журнала в самых разных местах - база данных, электронная почта, текстовый файл, журнал событий Windows и т. д. Моя команда настроила его для отправки подробной информации об ошибках в базу данных, а также для отправки электронной почты всей группе с достаточной информацией для нам, чтобы определить, в какой части кода возникла ошибка. Затем мы узнаем, кто отвечает за этот фрагмент кода, и они могут перейти к базе данных, чтобы получить более подробную информацию.

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

Например, наш код будет выглядеть так:

Try
  Dim p as New Person()
  p.Name = "Joe"
  p.Age = 30
Catch ex as Exception
  Log.LogException(ex,"Err creating person and assigning name/age")
  Throw ex
End Try

Таким образом, наш регистратор запишет всю необходимую информацию в базу данных SQL. У нас есть оповещения по электронной почте, настроенные на уровне БД, чтобы искать определенные ошибки или часто возникающие ошибки. Это помогает нам точно определить, откуда происходят ошибки.

Возможно, это не совсем то, что вы ищете. Другой подход, похожий на использование Global.asax, - это метод внедрения кода, такой как АОП с PostSharp . Это позволяет вам вставлять собственный код в начало и конец каждого метода или при каждом исключении. Это интересный подход, но я считаю, что он может сильно повлиять на производительность.

Я использовал объекты журнала Enterprise Library. Это позволяет вам вести различные типы журналов (плоский файл, электронная почта и / или база данных). Он довольно настраиваемый и имеет довольно хороший интерфейс для обновления вашего web.config для конфигурации ведения журнала. Обычно я вызываю свое ведение журнала из сообщения об ошибке в файле Global.asax.

Вот ссылка на MSDN

Я использую Log4net , настроенный на отправку сведений о фатальных ошибках по электронной почте. Он также настроен для записи всего в файл журнала, что неоценимо при попытке отладки проблем. Другое преимущество заключается в том, что если эта стандартная функциональность не выполняет то, что вы хотите, довольно легко написать настраиваемый аппендер, который может обрабатывать информацию журнала по мере необходимости.

Сказав это, я использую это в тандеме с настраиваемым обработчиком ошибок, который отправляет электронное письмо в формате html с немного большей информацией, чем включено в стандартные электронные письма log4net - страница, переменные сеанса, файлы cookie, переменные HTTP-сервера и т. Д.

Они оба подключены к событию Application_OnError, где исключение регистрируется как фатальное исключение в log4net (которое затем вызывает его отправку по электронной почте на указанный адрес электронной почты), а также обрабатывается с помощью специального обработчика ошибок.

Впервые услышал об Elmah из записи блога Coding Horror « Ответственность за сбой» , и, хотя это выглядит многообещающим, я еще не реализовал какие-либо проекты.

Недавно я создал веб-сервис asp.net с NLog, который я использую для всех своих настольных приложений. Ведение журнала отлично работает, когда я отлаживаю в Visual Studio, но как только я переключаюсь на IIS, файл журнала не создается; Я еще не определил, почему, но тот факт, что мне нужно искать решение, заставляет меня попробовать что-то еще для моих потребностей asp.net!

Я использую log4net, и когда я ожидаю исключения, я регистрирую его на соответствующем уровне. Я не склонен повторно генерировать исключение, потому что оно действительно не обеспечивает приятного взаимодействия с пользователем, вы можете предоставить меньше информации в текущем состоянии.

У меня Application_Error также настроен для перехвата любых исключений, которые не ожидались, и ошибка регистрируется как фатальный приоритет через log4net (ну, 404 обнаруживаются и регистрируются как Info, поскольку они не такой высокой серьезности).