Udostępnij za pośrednictwem


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. W tym samouczku opisano konfigurowanie systemu monitorowania kondycji w celu rejestrowania nieobsługiwane wyjątki 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 zgłaszane 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 procedury obsługi zdarzeń Error w celu zarejestrowania szczegółów błędu i powiadomienie 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 internetowe w bazie danych programu Microsoft SQL Server, dziennik 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 ze 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 do bazy 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 podrzędnych: <eventMappings>, <providers>i <rules>, odpowiednio.

Informacje o konfiguracji domyślnego Web.config systemu monitorowania kondycji można znaleźć w pliku w %WINDIR%\Microsoft.NET\Framework\version\CONFIG folderze . Poniżej przedstawiono te domyślne informacje o konfiguracji z pewnymi znacznikami usuniętymi w celu 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ą zdefiniowane w <eventMappings> elemecie , 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 wszelkie 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 programu 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> w celu rejestrowania źródeł 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, 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 programu 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 programu 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 przy użyciu 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 Book Reviews zawiera aspnet_WebEvent_LogEvent już procedurę 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 wystarczy poinstruować monitorowanie kondycji w celu zarejestrowania wszystkich nieobsługiwanych wyjątków w bazie danych. W tym celu dodaj następujący znacznik 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 znacznik 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 jedno zdarzenie monitorowania kondycji zainteresowania 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ę parametry połączenia zdefiniowaną <connectionStrings> w sekcji .
  • Na koniec element rules> wskazuje, <że gdy zostanie zarejestrowane zdarzenie "Wszystkie błędy" 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 wywoływane 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 szczegółów wyjątku śmierci (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 o pełnym rozmiarze)

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

Po bieżącej konfiguracji witryny internetowej system monitorowania kondycji rejestruje wszystkie nieobsługiwane wyjątki do 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 wyświetlającą 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, aby zezwolić tylko autoryzowanym użytkownikom na wyświetlanie szczegółów błędu. 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 samouczkami dotyczącymi zabezpieczeń witryny internetowej.

Uwaga

W kolejnym samouczku przedstawiono alternatywne rejestrowanie błędów i system powiadomień o nazwie ELMAH. ElMAH zawiera wbudowany mechanizm umożliwiający wyświetlanie dziennika błędów zarówno ze strony internetowej, jak i jako kanału informacyjnego RSS.

Rejestrowanie zdarzeń w wiadomości e-mail

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. Jest to realizowane przez określenie sposobu 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 wiadomości e-mail w ASP.NET i System.Net.Mail.
  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" do dostawcy ź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. Klasa SimpleMailWebEventProvider 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. TemplatedMailWebEventProvider W klasie należy określić stronę ASP.NET, której renderowany znacznik jest używany jako treść wiadomości e-mail. Klasa TemplatedMailWebEventProvider zapewnia znacznie większą kontrolę nad zawartością i formatem wiadomości e-mail, ale wymaga nieco większej 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 Web.config pliku, 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ższy znacznik używa SimpleMailWebEventProvider klasy jako dostawcy źródła dziennika i przypisuje mu przyjazną nazwę "EmailWebEventProvider". <add> Ponadto 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ługiwane wyjątki. 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 wiadomości e-mail" 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 To. 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 w witrynie wystąpi nieobsługiwany wyjątek, 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 e-mail
(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ą zgłaszane po rozwinięciu 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.

W tym samouczku skoncentrowano 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 oraz zawiera wiele zdarzeń monitorowania kondycji i źródeł dzienników, które nie zostały tutaj 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 kondycji Erika Reitana. Następnie zapoznaj się z tematem How To: Use Health Monitoring in ASP.NET 2.0 (Jak używać 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: