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


Запись в журнал сведений об ошибках с помощью наблюдения за состоянием системы 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 . Вы можете включить дополнительные элементы в <eventMappings><providers>разделы и <rules> разделы с помощью <add> элемента. Чтобы удалить параметр из конфигурации по умолчанию, используйте <remove> элемент или удалите <clear /> все значения по умолчанию из одного из этих разделов. Давайте настроим веб-приложение "Проверки книги", чтобы регистрировать все необработанные исключения в базу данных Microsoft SQL Server с помощью SqlWebEventProvider класса.

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

Примечание.

Это aspnet_regsql.exe средство было рассмотрено в руководстве по настройке веб-сайта, использующего службы приложений при добавлении поддержки ASP. Службы приложений NET. Следовательно, база данных веб-сайта "Обзоры книг" уже содержит 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.

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

Примечание.

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

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

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

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

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

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

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

Примечание.

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

Ведение журнала событий по электронной почте

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

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

  1. Настройте веб-приложение ASP.NET для отправки электронной почты. Это достигается путем указания способа отправки сообщений электронной почты с помощью <system.net> элемента конфигурации. Дополнительные сведения об отправке сообщений электронной почты в приложении ASP.NET см. в статье "Отправка электронной почты" в 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> содержит два правила. Первый из них с именем "Все ошибки по электронной почте" отправляет все необработанные исключения в источник журнала EmailWebEventProvider. Это правило влияет на отправку сведений об ошибках на веб-сайте в указанный адрес To. Правило "Все ошибки в базе данных" записывает сведения об ошибке в базу данных сайта. Следовательно, всякий раз, когда необработанное исключение происходит на сайте, его сведения записываются в базу данных и отправляются на указанный адрес электронной почты.

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

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

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

Итоги

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

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

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

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

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