Rejestrowanie szczegółów błędu za pomocą monitorowania kondycji ASP.NET (VB)

Autor : Scott Mitchell

System monitorowania kondycji firmy Microsoft zapewnia łatwy i dostosowywalny sposób rejestrowania różnych zdarzeń internetowych, w tym nieobsługiwane wyjątki. Ten samouczek przeprowadzi Cię przez proces konfigurowania systemu monitorowania kondycji w celu rejestrowania nieobsługiwanych wyjątków w bazie danych i powiadamiania deweloperów za pośrednictwem wiadomości e-mail.

Wprowadzenie

Rejestrowanie jest przydatnym narzędziem do monitorowania kondycji wdrożonej aplikacji i diagnozowania wszelkich problemów, które mogą wystąpić. Szczególnie ważne jest, aby rejestrować błędy występujące w wdrożonej aplikacji, aby można było je usunąć. Zdarzenie Error jest wywoływane za każdym razem, gdy w aplikacji ASP.NET wystąpi nieobsługiwany wyjątek. W poprzednim samouczku pokazano, jak powiadomić dewelopera o błędzie i zarejestrować jego szczegóły, tworząc procedurę obsługi zdarzeń dla Error zdarzenia. Jednak utworzenie programu obsługi zdarzeń Error w celu rejestrowania szczegółów błędu i powiadamianie dewelopera jest niepotrzebne, ponieważ to zadanie może być wykonywane przez platformę ASP. System monitorowania kondycji platformy NET.

System monitorowania kondycji został wprowadzony w ASP.NET 2.0 i został zaprojektowany pod kątem monitorowania kondycji wdrożonej aplikacji ASP.NET przez rejestrowanie zdarzeń występujących w okresie istnienia aplikacji lub żądania. Zdarzenia rejestrowane przez system monitorowania kondycji są określane jako zdarzenia monitorowania kondycji lub zdarzenia sieci Web i obejmują:

  • Zdarzenia okresu istnienia aplikacji, takie jak po uruchomieniu lub zatrzymaniu aplikacji
  • Zdarzenia zabezpieczeń, w tym nieudane próby logowania i nieudane żądania autoryzacji adresu URL
  • Błędy aplikacji, w tym nieobsługiwane wyjątki, wyświetlanie wyjątków analizowania stanu, wyjątki weryfikacji żądań i błędy kompilacji, między innymi typy błędów.

Po wystąpieniu zdarzenia monitorowania kondycji można je zarejestrować w dowolnej liczbie określonych źródeł dziennika. System monitorowania kondycji jest dostarczany ze źródłami dzienników, które rejestrują zdarzenia sieci Web do bazy danych usługi Microsoft SQL Server, do dziennika zdarzeń systemu Windows lub za pośrednictwem wiadomości e-mail, między innymi. Możesz również utworzyć własne źródła dzienników.

Zdarzenia dzienników systemu monitorowania kondycji wraz z używanymi źródłami dzienników są definiowane w pliku Web.config. Za pomocą kilku wierszy znaczników konfiguracji można użyć monitorowania kondycji, aby rejestrować wszystkie nieobsługiwane wyjątki w bazie danych i powiadamiać o wyjątku za pośrednictwem poczty e-mail.

Eksplorowanie konfiguracji systemu monitorowania kondycji

Zachowanie systemu monitorowania kondycji jest definiowane przez informacje o konfiguracji, które znajdują się w elemecie<healthMonitoring> w Web.configprogramie . Ta sekcja konfiguracji definiuje między innymi następujące trzy ważne informacje:

  1. Zdarzenia monitorowania kondycji, które po wyświetleniu powinny być rejestrowane,
  2. Źródła dzienników i
  3. Jak każde zdarzenie monitorowania kondycji zdefiniowane w (1) jest mapowane na źródła dziennika zdefiniowane w (2).

Te informacje są określane za pomocą trzech elementów konfiguracji elementów podrzędnych: <eventMappings>, <providers>i <rules>, odpowiednio.

Domyślne informacje o konfiguracji systemu monitorowania kondycji można znaleźć w Web.config pliku w %WINDIR%\Microsoft.NET\Framework\version\CONFIG folderze . Poniżej przedstawiono te domyślne informacje o konfiguracji z pewnymi znacznikami usuniętymi na potrzeby zwięzłości:

<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>

Zdarzenia monitorowania kondycji są definiowane w elemecie <eventMappings> , który nadaje przyjazną dla człowieka nazwę klasy zdarzeń monitorowania kondycji. W powyższym <eventMappings> znaczniku element przypisuje przyjazną dla człowieka nazwę "Wszystkie błędy" do zdarzeń monitorowania kondycji typu WebBaseErrorEvent i nazwę "Inspekcje niepowodzeń" do zdarzeń monitorowania kondycji typu WebFailureAuditEvent.

Element <providers> definiuje źródła dzienników, nadając im przyjazną dla człowieka nazwę i określając informacje o konfiguracji specyficzne dla źródła dziennika. Pierwszy <add> element definiuje dostawcę "EventLogProvider", który rejestruje określone zdarzenia monitorowania kondycji EventLogWebEventProvider przy użyciu klasy . Klasa EventLogWebEventProvider rejestruje zdarzenie w dzienniku zdarzeń systemu Windows. Drugi <add> element definiuje dostawcę "SqlWebEventProvider", który rejestruje zdarzenia w bazie danych microsoft SQL Server za pośrednictwem SqlWebEventProvider klasy . Konfiguracja "SqlWebEventProvider" określa parametry połączenia bazy danych (connectionStringName) między innymi opcjami konfiguracji.

Element <rules> mapuje zdarzenia określone w elemecie <eventMappings> na źródła dziennika w elemecie <providers> . Domyślnie ASP.NET aplikacje internetowe rejestrują wszystkie nieobsługiwane wyjątki i błędy inspekcji w dzienniku zdarzeń systemu Windows.

Rejestrowanie zdarzeń w bazie danych

Domyślną konfigurację systemu monitorowania kondycji można dostosować na podstawie aplikacji internetowej przez aplikację internetową, dodając sekcję <healthMonitoring> do pliku aplikacji Web.config . Możesz uwzględnić dodatkowe elementy w <eventMappings>sekcjach , <providers>i <rules> przy użyciu <add> elementu . Aby usunąć ustawienie z konfiguracji domyślnej, użyj <remove> elementu lub użyj polecenia <clear /> , aby usunąć wszystkie wartości domyślne z jednej z tych sekcji. Skonfigurujmy aplikację internetową Recenzje książek, aby rejestrować wszystkie nieobsługiwane wyjątki do bazy danych microsoft SQL Server przy użyciu SqlWebEventProvider klasy .

Klasa SqlWebEventProvider jest częścią systemu monitorowania kondycji i rejestruje zdarzenie monitorowania kondycji do określonej bazy danych SQL Server. Klasa oczekuje, że określona SqlWebEventProvider baza danych zawiera procedurę składowaną o nazwie aspnet_WebEvent_LogEvent. Ta procedura składowana jest przekazywana ze szczegółami zdarzenia i ma za zadanie przechowywanie szczegółów zdarzenia. Dobrą wiadomością jest to, że nie trzeba tworzyć tej procedury składowanej ani tabeli do przechowywania szczegółów zdarzenia. Te obiekty można dodać do bazy danych za pomocą aspnet_regsql.exe narzędzia .

Uwaga

Narzędzie aspnet_regsql.exe zostało omówione z powrotem w samouczku Konfigurowanie witryny internetowej korzystającej z usług aplikacji podczas dodawania obsługi platformy ASP. Usługi aplikacji platformy NET. W związku z tym baza danych witryny internetowej Recenzje książek zawiera już procedurę aspnet_WebEvent_LogEvent składowaną, która przechowuje informacje o zdarzeniu w tabeli o nazwie aspnet_WebEvent_Events.

Po dodaniu niezbędnej procedury składowanej i tabeli do bazy danych należy poinstruować monitorowanie kondycji, aby rejestrować wszystkie nieobsługiwane wyjątki dla bazy danych. W tym celu dodaj następujące znaczniki do pliku witryny internetowej 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>

Powyższy kod konfiguracji monitorowania kondycji używa <clear /> elementów do czyszczenia wstępnie zdefiniowanych informacji o konfiguracji monitorowania kondycji z <eventMappings>sekcji , <providers>i <rules> . Następnie dodaje pojedynczy wpis do każdej z tych sekcji.

  • Element <eventMappings> definiuje pojedyncze interesujące zdarzenie monitorowania kondycji o nazwie "Wszystkie błędy", które jest zgłaszane za każdym razem, gdy wystąpi nieobsługiwany wyjątek.
  • Element <providers> definiuje jedno źródło dziennika o nazwie "SqlWebEventProvider", które używa SqlWebEventProvider klasy . Atrybut connectionStringName został ustawiony na wartość "ReviewsConnectionString", czyli nazwę naszych parametrów połączenia zdefiniowanych <connectionStrings> w sekcji .
  • Na koniec element rules> wskazuje, <że gdy zdarzenie "Wszystkie błędy" zostanie zarejestrowane przy użyciu dostawcy "SqlWebEventProvider".

Te informacje o konfiguracji instruują system monitorowania kondycji, aby rejestrował wszystkie nieobsługiwane wyjątki do bazy danych Recenzje książek.

Uwaga

Zdarzenie WebBaseErrorEvent jest zgłaszane tylko w przypadku błędów serwera; nie jest zgłaszane w przypadku błędów HTTP, takich jak żądanie dla zasobu ASP.NET, który nie został znaleziony. Różni się to od zachowania HttpApplication zdarzenia klasy Error , które jest zgłaszane zarówno dla błędów serwera, jak i HTTP.

Aby zobaczyć, jak działa system monitorowania kondycji, odwiedź witrynę internetową i wygeneruj błąd środowiska uruchomieniowego, odwiedzając stronę Genre.aspx?ID=foo. Powinna zostać wyświetlona odpowiednia strona błędu — żółty ekran śmierci Szczegóły wyjątku (podczas odwiedzania lokalnie) lub niestandardowa strona błędu (podczas odwiedzania witryny w środowisku produkcyjnym). W tle system monitorowania kondycji zarejestrował informacje o błędzie w bazie danych. W tabeli powinien znajdować się jeden rekord aspnet_WebEvent_Events (patrz Rysunek 1). Ten rekord zawiera informacje o błędzie środowiska uruchomieniowego, który właśnie wystąpił.

Zrzut ekranu przedstawiający szczegóły błędu zarejestrowane w tabeli.

Rysunek 1. Szczegóły błędu zostały zarejestrowane w aspnet_WebEvent_Events tabeli
(Kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Wyświetlanie dziennika błędów na stronie internetowej

W przypadku bieżącej konfiguracji witryny internetowej system monitorowania kondycji rejestruje wszystkie nieobsługiwane wyjątki bazy danych. Jednak monitorowanie kondycji nie zapewnia żadnego mechanizmu wyświetlania dziennika błędów za pośrednictwem strony internetowej. Można jednak utworzyć stronę ASP.NET, która wyświetla te informacje z bazy danych. (Jak zobaczymy chwilowo, możesz zdecydować się na wysłanie szczegółów błędu w wiadomości e-mail).

Jeśli tworzysz taką stronę, upewnij się, że wykonasz kroki umożliwiające wyświetlanie szczegółów błędu tylko autoryzowanym użytkownikom. Jeśli witryna już korzysta z kont użytkowników, możesz użyć reguł autoryzacji adresów URL, aby ograniczyć dostęp do strony do określonych użytkowników lub ról. Aby uzyskać więcej informacji na temat udzielania lub ograniczania dostępu do stron internetowych na podstawie zalogowanego użytkownika, zapoznaj się z moimi samouczkami dotyczącymi zabezpieczeń witryny internetowej.

Uwaga

W kolejnym samouczku przedstawiono alternatywny system rejestrowania błędów i powiadomień o nazwie ELMAH. Funkcja ELMAH zawiera wbudowany mechanizm do wyświetlania dziennika błędów zarówno ze strony internetowej, jak i jako kanału informacyjnego RSS.

Rejestrowanie zdarzeń w Email

System monitorowania kondycji zawiera dostawcę źródła dziennika, który "rejestruje" zdarzenie w wiadomości e-mail. Źródło dziennika zawiera te same informacje, które są rejestrowane w bazie danych w treści wiadomości e-mail. Tego źródła dziennika można użyć do powiadamiania dewelopera o wystąpieniu określonego zdarzenia monitorowania kondycji.

Zaktualizujmy konfigurację witryny Internetowej Recenzje książek, aby otrzymywać wiadomość e-mail za każdym razem, gdy wystąpi wyjątek. Aby to osiągnąć, musimy wykonać trzy zadania:

  1. Skonfiguruj aplikację internetową ASP.NET do wysyłania wiadomości e-mail. Można to osiągnąć, określając sposób wysyłania wiadomości e-mail za pośrednictwem <system.net> elementu konfiguracji. Aby uzyskać więcej informacji na temat wysyłania wiadomości e-mail w aplikacji ASP.NET, zobacz Wysyłanie Email w ASP.NET i System.Net.Mail — często zadawane pytania.
  2. Zarejestruj dostawcę źródła dziennika poczty e-mail w elemecie <providers> i
  3. Dodaj wpis do <rules> elementu, który mapuje zdarzenie "Wszystkie błędy" na dostawcę źródła dziennika dodanego w kroku (2).

System monitorowania kondycji obejmuje dwie klasy dostawców źródeł dzienników poczty e-mail: SimpleMailWebEventProvider i TemplatedMailWebEventProvider. KlasaSimpleMailWebEventProvider wysyła wiadomość e-mail w postaci zwykłego tekstu zawierającą szczegóły zdarzenia i zapewnia niewielkie dostosowanie treści wiadomości e-mail. W przypadku TemplatedMailWebEventProvider klasy należy określić stronę ASP.NET, której renderowane znaczniki są używane jako treść wiadomości e-mail. KlasaTemplatedMailWebEventProvider zapewnia znacznie większą kontrolę nad zawartością i formatem wiadomości e-mail, ale wymaga nieco więcej pracy z góry, ponieważ musisz utworzyć stronę ASP.NET, która generuje treść wiadomości e-mail. Ten samouczek koncentruje się na korzystaniu z SimpleMailWebEventProvider klasy .

Zaktualizuj element systemu <providers> monitorowania kondycji w pliku, Web.config aby uwzględnić źródło dziennika dla SimpleMailWebEventProvider klasy:

<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>

Powyższe znaczniki używają SimpleMailWebEventProvider klasy jako dostawcy źródła dziennika i przypisuje mu przyjazną nazwę "EmailWebEventProvider". Ponadto <add> atrybut zawiera dodatkowe opcje konfiguracji, takie jak adresy Do i Od wiadomości e-mail.

Po zdefiniowaniu źródła dziennika poczty e-mail wystarczy poinstruować system monitorowania kondycji, aby używał tego źródła do "rejestrowania" nieobsługiwanych wyjątków. Jest to realizowane przez dodanie nowej reguły w <rules> sekcji:

<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>

Sekcja <rules> zawiera teraz dwie reguły. Pierwszy o nazwie "Wszystkie błędy do Email" wysyła wszystkie nieobsługiwane wyjątki do źródła dziennika "EmailWebEventProvider". Ta reguła ma wpływ na wysyłanie szczegółowych informacji o błędach w witrynie internetowej do określonego adresu Do. Reguła "Wszystkie błędy do bazy danych" rejestruje szczegóły błędu w bazie danych lokacji. W związku z tym za każdym razem, gdy wystąpi nieobsługiwany wyjątek w witrynie, jego szczegóły są rejestrowane w bazie danych i wysyłane na określony adres e-mail.

Rysunek 2 przedstawia wiadomość e-mail wygenerowaną przez klasę SimpleMailWebEventProvider podczas odwiedzania obiektu Genre.aspx?ID=foo.

Zrzut ekranu przedstawiający szczegóły wysyłane w wiadomości e-mail.

Rysunek 2. Szczegóły błędu są wysyłane w wiadomości Email
(Kliknij, aby wyświetlić obraz o pełnym rozmiarze)

Podsumowanie

System monitorowania kondycji ASP.NET został zaprojektowany tak, aby umożliwić administratorom monitorowanie kondycji wdrożonej aplikacji internetowej. Zdarzenia monitorowania kondycji są wywoływane w przypadku rozwoju niektórych akcji, takich jak zatrzymanie aplikacji, gdy użytkownik pomyślnie zaloguje się do lokacji lub gdy wystąpi nieobsługiwany wyjątek. Te zdarzenia można rejestrować w dowolnej liczbie źródeł dzienników. W tym samouczku pokazano, jak rejestrować szczegóły nieobsługiwane wyjątki do bazy danych i za pośrednictwem wiadomości e-mail.

Ten samouczek koncentruje się na używaniu monitorowania kondycji do rejestrowania nieobsługiwanych wyjątków, ale należy pamiętać, że monitorowanie kondycji jest przeznaczone do mierzenia ogólnej kondycji wdrożonej aplikacji ASP.NET i zawiera wiele zdarzeń monitorowania kondycji i źródeł dzienników, które nie zostały tu zbadane. Co więcej, możesz utworzyć własne zdarzenia monitorowania kondycji i źródła dzienników, jeśli będą potrzebne. Jeśli chcesz dowiedzieć się więcej na temat monitorowania kondycji, dobrym pierwszym krokiem jest zapoznanie się z często zadawanymi pytaniami dotyczącymi monitorowania kondycjiErika Reitana. W tym celu zapoznaj się z tematem Instrukcje: korzystanie z monitorowania kondycji w ASP.NET 2.0.

Szczęśliwe programowanie!

Dalsze informacje

Aby uzyskać więcej informacji na temat tematów omówionych w tym samouczku, zapoznaj się z następującymi zasobami: