Удобный мониторинг ошибок в приложении ASP.NET

    Здравствуйте, уважаемы читатели Хабра. В данном посте я хочу рассказать вам о модуле для мониторинга ошибок в ASP.NET — ELMAH (Error Logging Modules and Handlers).

    Для чего это может быть полезным:


    Представьте ситуацию, когда у вас есть работающий в Prod режиме сайт с большим количеством юзеров выполняющих разнообразные бизнес задачи. Время от времени некоторые пользователи сообщают о спонтанно возникающих ошибках, которые на Dev окружении воспроизвести не удается. При этом очень трудно бывает понять по описанию юзера что может быть причиной ошибки и при какой комбинации действий она произошла.

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

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

    Список всех ошибок:




    Детальное описание по каждой ошибке:


    (Страница достаточно большая, поэтому вот ссылка)

    Как теперь добавить все это к своему сайту:


    Благодаря dependency injection вы можете очень просто подключить весь функционал к уже работающему сайту без необходимости его модифицировать. Для этого надо:

    1. Добавить библиотеку Elmah.dll в проект.
    2. Добавить параметры конфигурация в web.config.

    Саму библиотеку вы найдете по ссылке на официальный сайт внизу поста. Далее я опишу минимальные изменения в web.config необходимые для перехватывания и вывода ошибок в лог.
    1. Добавляем параметры в <configSections>:

    2. Добавляем секцию в <httpHandlers>:

    3. Добавляем секцию в <httpModules>:

    4. Также нужно указать, где будут сохраняться ошибки — для этого добавьте секцию в <configuration>:


      Если нужно использовать базу данных вместо файловой системы делаем так:



    Готово, теперь все ошибки возникающие на вашем сайте будут доступны на странице: http://server/elmah.axd

    Из полезных особенностей еще отмечу:
    1. Поддержка SQL Server, Oracle SQLite, MS Access.
    2. Фильтры нежелательных ошибок (например ошибки аутентификации).
    3. RSS списки ошибок.
    4. Отправка ошибок на Twitter.
    5. Поддержка пользовательских эксепшенов (вы можете вызвать метод библиотеки подав на вход собственный эксепшен и он попадет в общий список ошибок)


    Если хочется немного поиграться, вот простенький пример сайта с подключенным Elmah:
    tr.im/elmahtest

    Тем кто захочет всерьез использовать Elmah рекомендую посетить официальный сайт. Там есть исходники, бинарники и документация: code.google.com/p/elmah
    И вот здесь еще есть детальное описание с примерами: dotnetslackers.com/articles/aspnet/ErrorLoggingModulesAndHandlers.aspx

    Спасибо за внимание. Надеюсь, для кого-то этот пост будет полезен :)

    Метки:
    Поделиться публикацией
    Похожие публикации
    Комментарии 16
    • 0
      перенесите, пожалуйста, в блог .net
    • 0
      Если он действительно просто позволит записывать в БД все unhandled exceptions, то тогда надо пробовать!
      Насколько это дополнительно нагрузит сайт, если посетителей много и исключения пока, к сожалению, не редкость (есть опыт?). Особенно, если по каждой ошибке надо будет писать в БД (удалённую), отсылать по e-mail.
      • +2
        Если они настолько часты, что запись в лог может существенно напрячь сервер, то у сайта уже большие проблемы. Экономия на записи в лог вряд ли спасет. :)

        Серьезно говоря, на эти дополнительные расходы не нужно обращать внимания. Теряются на фоне остального.
    • 0
      Судя по описанию, вещь полезная. Нужно обязательно испытать, а то пока что ориентируюсь исключительно с голоса пользователей ))
    • +2
      Вообще главное, что даёт ELMAH — это полная трасса exception-ов, включая вложенные.

      Встроенный в ASP.NET HealthMonitoring вложенные exception не показывает, а ELMAH их присылает на почту в виде полного YSOD.

      Ну и сохранение в базу — приятный бонус :)
    • 0
      Ндя, практически все тоже самое уже есть в ASP.NET… Тока пузырит в EventLog. И вообще ничего настраивать не надо.
      • 0
        Дык в том-то и беда, что по умолчанию для просмотра ошибки придется заходить на удаленный компьютер, лезть в EventLog и т.д.

        А тут все под рукой, в браузере (или в почтовом ящике).
        • 0
          ага, особенно когда просишь не шибко умного партнера или клиента выслать лог ошибок сервера, а он понятия не имеет что это такое.
          • 0
            Точно-точно. Ничто так не помогает разобраться в ошибке, как скриншот главного окна Event Viewer в формате BMP.
        • 0
          Мы еще на момент деплоя настроили форвардинг евентов на центральный мониторинг сервер. К мониторинг сереверу еесно получили доступ. Там же настроили мыло для ошибок.

          Короче. Суть в том что такие проблемы достаточно легко обоходятся если побеспокоится заранее.
    • 0
      Писать ошибки в базу не очень правильно на мой взгляд. Это хорошо до тех пор, пока не случаются ошибки с самой базой, что в самых запущенных случаях приводит просто к безумным последствиям для приложения. Т.е. это заранее надо всегда отлаживать и проверять.

      PS: Отправка ошибок на Twitter. — А вот за это авторам респект, смысла никакого, но зато на модной волне и прикольно :)
      • 0
        Если при обработке ошибки в самом Elmah'e происходит ошибка (например база недоступна), то такие ошибки никуда выбрасываться не будут чтобы не нарушить работу главного апликейшена.
        • 0
          Глотание ошибок системой логгирования ошибок, вещь на самом деле ещё более неприятная. Позволяет запутать картину поведения приложения так, что потом концов не найдёшь. (Конечно, такие фаталы редкость, но в тоже время, иногда и бывает, что по крупицам поведение приложения потом приходится вытягивать).
    • 0
      Я у себя реализовал Application_Error в global.asax, сделал отсылку на email и вместе с текстом ошибки добавил ещё кучу полезной инфы. Работы там буквально на 15мин было.
      • 0
        Не боитесь случайного заспамления?
    • 0
      Неужели так сложно вставлять исходники текстом? Я молчу про копирование, но ничего что у некоторых публичные файлообменники могут быть просто заблокированы корпоративной политикой?

    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.