Поделиться через


Запись в журнал сведений об ошибках с помощью наблюдения за состоянием системы ASP.NET (C#)

Скотт Митчелл

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

Введение

Ведение журнала — это полезный инструмент для мониторинга работоспособности развернутого приложения и диагностики любых проблем, которые могут возникнуть. Особенно важно регистрировать ошибки, возникающие в развернутом приложении, чтобы их можно было исправить. Событие Error возникает всякий раз, когда в ASP.NET приложении возникает необработанное исключение. В предыдущем руководстве показано, как уведомлять разработчика об ошибке и регистрировать ее сведения путем создания обработчика событий для Error события. Однако создание обработчика Error событий для регистрации сведений об ошибке и уведомления разработчика не требуется, так как эту задачу может выполнять ASP. Система мониторинга работоспособности NET.

Система мониторинга работоспособности появилась в ASP.NET 2.0 и предназначена для мониторинга работоспособности развернутого приложения ASP.NET путем ведения журнала событий, происходящих в течение времени существования приложения или запроса. События, зарегистрированные системой мониторинга работоспособности, называются событиями мониторинга работоспособности или веб-событиями и включают:

  • События времени существования приложения, например при запуске или остановке приложения
  • События безопасности, включая неудачные попытки входа и неудачные запросы авторизации URL-адреса
  • Ошибки приложения, в том числе необработанных исключений, исключения синтаксического анализа состояния просмотра, исключения проверки запросов и ошибки компиляции, а также другие типы ошибок.

При возникновении события мониторинга работоспособности оно может быть зарегистрировано в любом количестве указанных источников журналов. Система мониторинга работоспособности поставляется с источниками журналов, которые регистрируют веб-события в базе данных Microsoft SQL Server, журнале событий Windows или в сообщении электронной почты. Вы также можете создать собственные источники журналов.

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

Изучение конфигурации системы мониторинга работоспособности

Поведение системы мониторинга работоспособности определяется сведениями о конфигурации, которые находятся в элементе<healthMonitoring> в Web.config. В этом разделе конфигурации определены, среди прочего, следующие три важных элемента информации:

  1. События мониторинга работоспособности, которые должны быть зарегистрированы при возникновении.
  2. Источники журналов и
  3. Как каждое событие мониторинга работоспособности, определенное в (1), сопоставляется с источниками журналов, определенными в (2).

Эти сведения указываются с помощью трех дочерних элементов конфигурации: <eventMappings>, <providers>и <rules>соответственно.

Сведения о конфигурации системы мониторинга работоспособности по умолчанию можно найти в файле в %WINDIR%\Microsoft.NET\Framework\version\CONFIG папке Web.config . Ниже приведены сведения о конфигурации по умолчанию с некоторыми исправлениями, удаленными для краткости:

<configuration>
  <system.web>
  <healthMonitoring>
  <eventMappings>
  <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>

  <add name="Failure Audits" type="System.Web.Management.WebFailureAuditEvent,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" startEventCode="0" endEventCode="2147483647"/>
  </eventMappings>

  <providers>
  <add name="EventLogProvider" type="System.Web.Management.EventLogWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>

  <add connectionStringName="LocalSqlServer" maxEventDetailsLength="1073741823" buffer="false" bufferMode="Notification" name="SqlWebEventProvider" type="System.Web.Management.SqlWebEventProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
  </providers>

  <rules>
  <add name="All Errors Default" eventName="All Errors" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>

  <add name="Failure Audits Default" eventName="Failure Audits" provider="EventLogProvider" profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:01:00" custom=""/>
  </rules>
  </healthMonitoring>
  </system.web>
</configuration>

Интересующие события мониторинга работоспособности определяются в элементе <eventMappings> , который дает понятное для человека имя классу событий мониторинга работоспособности. В приведенной выше <eventMappings> разметке элемент присваивает понятное для человека имя "Все ошибки" событиям мониторинга работоспособности типа WebBaseErrorEvent , а имя "Аудиты сбоев" — событиям мониторинга работоспособности типа WebFailureAuditEvent.

Элемент <providers> определяет источники журналов, предоставляя им понятное имя и указывая сведения о конфигурации, относящиеся к конкретному источнику журнала. Первый <add> элемент определяет поставщик EventLogProvider, который регистрирует указанные события мониторинга работоспособности с помощью EventLogWebEventProvider класса . Класс EventLogWebEventProvider регистрирует событие в журнале событий Windows. Второй <add> элемент определяет поставщик SqlWebEventProvider, который регистрирует события в базе данных Microsoft SQL Server через SqlWebEventProvider класс . Конфигурация SqlWebEventProvider указывает строку подключения базы данных (connectionStringName) среди других параметров конфигурации.

Элемент <rules> сопоставляет события, указанные в элементе , <eventMappings> с источниками журнала в элементе <providers> . По умолчанию ASP.NET веб-приложения регистрируют все необработанных исключений и ошибки аудита в журнале событий Windows.

Ведение журнала событий в базе данных

Конфигурацию системы мониторинга работоспособности по умолчанию можно настроить для каждого веб-приложения, добавив <healthMonitoring> раздел в файл приложения Web.config . С помощью <add> элемента можно включить дополнительные элементы в <eventMappings>разделы , <providers>и <rules> . Чтобы удалить параметр из конфигурации по умолчанию, используйте <remove> элемент или , <clear /> чтобы удалить все значения по умолчанию из одного из этих разделов. Давайте настроим веб-приложение Book Reviews для записи всех необработанных исключений в базу данных Microsoft SQL Server с помощью SqlWebEventProvider класса .

Класс SqlWebEventProvider является частью системы мониторинга работоспособности и регистрирует событие мониторинга работоспособности в указанной базе данных SQL Server. Класс SqlWebEventProvider ожидает, что указанная база данных содержит хранимую процедуру с именем aspnet_WebEvent_LogEvent. Эта хранимая процедура передает сведения о событии и ей поручено сохранить сведения о событии. Хорошей новостью является то, что вам не нужно создавать эту хранимую процедуру или таблицу для хранения сведений о событии. Эти объекты можно добавить в базу данных с помощью aspnet_regsql.exe средства .

Примечание

Это aspnet_regsql.exe средство обсуждалось еще в руководстве Настройка веб-сайта, использующего службы приложений, когда мы добавили поддержку ASP. Службы приложений NET. Следовательно, база данных веб-сайта Book Reviews уже содержит хранимую aspnet_WebEvent_LogEvent процедуру, которая хранит сведения о событии в таблице с именем aspnet_WebEvent_Events.

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

<configuration>
  ...
  <system.web>
  ...
  <healthMonitoring enabled="true">
  <eventMappings>
  <clear />

  <add name="All Errors" type="System.Web.Management.WebBaseErrorEvent"
  startEventCode="0" endEventCode="2147483647" />
  </eventMappings>

  <providers>
  <clear />

  <add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
  buffer="false" name="SqlWebEventProvider"
  type="System.Web.Management.SqlWebEventProvider" />
  </providers>

  <rules>
  <clear />

  <add name="All Errors Default" eventName="All Errors" provider="SqlWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
  </rules>
  </healthMonitoring>
  </system.web>
</configuration>

В приведенной выше разметке конфигурации мониторинга работоспособности используются <clear /> элементы для очистки предварительно определенных сведений о конфигурации мониторинга работоспособности из <eventMappings>разделов , <providers>и <rules> . Затем в каждый из этих разделов добавляется одна запись.

  • Элемент <eventMappings> определяет одно интересующее событие мониторинга работоспособности с именем "Все ошибки", которое возникает при возникновении необработанного исключения.
  • Элемент <providers> определяет один источник журнала с именем "SqlWebEventProvider", который использует SqlWebEventProvider класс . Атрибуту connectionStringName присвоено значение ReviewsConnectionString, которое является именем строки подключения, определенной <connectionStrings> в разделе .
  • Наконец, элемент rules> указывает, <что при возникновении события "Все ошибки" оно должно быть зарегистрировано с помощью поставщика SqlWebEventProvider.

Эти сведения о конфигурации предписывают системе мониторинга работоспособности регистрировать все необработанных исключений в базе данных Book Reviews.

Примечание

Событие WebBaseErrorEvent возникает только для ошибок сервера; оно не вызывается для ошибок HTTP, таких как запрос ASP.NET ресурса, который не найден. Это отличается от поведения HttpApplication события класса Error , которое возникает при ошибках сервера и HTTP.

Чтобы увидеть систему мониторинга работоспособности в действии, посетите веб-сайт и создайте ошибку среды выполнения, посетив .Genre.aspx?ID=foo Вы должны увидеть соответствующую страницу ошибок — либо желтый экран исключения (при локальном посещении), либо пользовательскую страницу ошибок (при посещении сайта в рабочей среде). В фоновом режиме система мониторинга работоспособности заносила сведения об ошибках в базу данных. В таблице должна быть одна запись aspnet_WebEvent_Events (см . рис. 1). Эта запись содержит сведения о только что произошедшей ошибке среды выполнения.

Снимок экрана: сведения об ошибке, зарегистрированные в таблице.

Рис. 1. Сведения об ошибке были записаны в таблицу aspnet_WebEvent_Events
(Щелкните для просмотра полноразмерного изображения)

Отображение журнала ошибок на веб-странице

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

При создании такой страницы обязательно выполните действия, чтобы разрешить просмотр сведений об ошибке только авторизованным пользователям. Если на сайте уже используются учетные записи пользователей, можно использовать правила авторизации URL-адресов, чтобы ограничить доступ к странице определенными пользователями или ролями. Дополнительные сведения о предоставлении или ограничении доступа к веб-страницам на основе вошедшего пользователя см. в учебниках по безопасности веб-сайтов.

Примечание

В следующем руководстве рассматривается альтернативная система ведения журнала ошибок и уведомления с именем ELMAH. ELMAH включает встроенный механизм для просмотра журнала ошибок как с веб-страницы, так и в виде RSS-канала.

Ведение журнала событий в Email

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

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

  1. Настройте веб-приложение ASP.NET для отправки электронной почты. Это достигается путем указания способа отправки сообщений электронной почты через элемент конфигурации <system.net> . Дополнительные сведения об отправке сообщений электронной почты в приложении ASP.NET см. в статьях Отправка Email в ASP.NET и Вопросы и ответы по System.Net.Mail.
  2. Зарегистрируйте поставщик источника журнала электронной почты в элементе <providers> и
  3. Добавьте запись в <rules> элемент , который сопоставляет событие "Все ошибки" с поставщиком источника журнала, добавленным на шаге (2).

Система мониторинга работоспособности включает два класса поставщика источника журнала электронной почты: SimpleMailWebEventProvider и TemplatedMailWebEventProvider. КлассSimpleMailWebEventProvider отправляет сообщение электронной почты в виде обычного текста, включающее сведения о событии, и практически не настраивает текст сообщения электронной почты. С помощью класса вы указываете TemplatedMailWebEventProvider ASP.NET страницу, разметка которой используется в качестве текста сообщения электронной почты. КлассTemplatedMailWebEventProvider обеспечивает гораздо больший контроль над содержимым и форматом сообщения электронной почты, но требует немного больше предварительной работы, так как вам нужно создать ASP.NET страницу, которая создает текст сообщения электронной почты. В этом руководстве основное внимание уделяется SimpleMailWebEventProvider использованию класса .

Обновите элемент системы <providers> мониторинга работоспособности в файле, Web.config чтобы включить источник журнала для SimpleMailWebEventProvider класса :

<providers>
  <clear />

  <add type="System.Web.Management.SimpleMailWebEventProvider"
  name="EmailWebEventProvider" buffer="false"
  from="support@example.com" to="support@example.com"
  subjectPrefix="Book Reviews Runtime Error: " />
  
  <add connectionStringName="ReviewsConnectionString" maxEventDetailsLength="1073741823"
  buffer="false" name="SqlWebEventProvider"
  type="System.Web.Management.SqlWebEventProvider" />
</providers>

В приведенной выше разметке SimpleMailWebEventProvider в качестве поставщика источника журналов используется класс и присваивается ему понятное имя "EmailWebEventProvider". Кроме того, <add> атрибут включает дополнительные параметры конфигурации, такие как адреса "На" и "От" сообщения электронной почты.

После определения источника журнала электронной почты остается только указать системе мониторинга работоспособности использовать этот источник для регистрации необработанных исключений. Для этого нужно добавить новое правило в <rules> раздел :

<rules>
  <clear />

  <add name="All Errors To Email" eventName="All Errors" provider="EmailWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />

  <add name="All Errors To Database" eventName="All Errors" provider="SqlWebEventProvider"
  profile="Default" minInstances="1" maxLimit="Infinite" minInterval="00:00:00" />
</rules>

Теперь <rules> раздел содержит два правила. Первый с именем "Все ошибки Email" отправляет все необработанные исключения в источник журнала EmailWebEventProvider. Это правило имеет эффект отправки сведений об ошибках на веб-сайте по указанному адресу To. Правило "Все ошибки в базе данных" записывает сведения об ошибке в базу данных сайта. Следовательно, при возникновении необработанного исключения на сайте его сведения регистрируются в базе данных и отправляются на указанный адрес электронной почты.

На рисунке 2 показано сообщение электронной почты, созданное классом SimpleMailWebEventProvider при посещении Genre.aspx?ID=foo.

Снимок экрана: сведения об ошибке, отправленные в сообщении электронной почты.

Рис. 2. Сведения об ошибке отправляются в Email сообщении
(Щелкните для просмотра полноразмерного изображения)

Итоги

Система мониторинга работоспособности ASP.NET позволяет администраторам отслеживать работоспособность развернутого веб-приложения. События мониторинга работоспособности возникают при развертывании определенных действий, например при остановке приложения, при успешном входе пользователя на сайт или при возникновении необработанного исключения. Эти события можно регистрировать в любом количестве источников журналов. В этом руководстве показано, как регистрировать сведения о необработанных исключениях в базе данных и с помощью сообщения электронной почты.

В этом руководстве основное внимание уделяется использованию мониторинга работоспособности для регистрации необработанных исключений, но помните, что мониторинг работоспособности предназначен для измерения общей работоспособности развернутого приложения ASP.NET и включает множество событий мониторинга работоспособности и источников журналов, не рассмотренных здесь. Более того, при необходимости можно создавать собственные события мониторинга работоспособности и источники журналов. Если вы хотите узнать больше о мониторинге работоспособности, хороший первый шаг — прочитать часто задаваемые вопросы по мониторингу здоровьяЭрика Рейтана. После этого ознакомьтесь с разделом Практическое руководство. Использование мониторинга работоспособности в ASP.NET 2.0.

Счастливого программирования!

Дополнительные материалы

Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах: