Udostępnij za pośrednictwem


Rejestrowanie szczegółów błędów za pomocą biblioteki ELMAH (C#)

Autor : Scott Mitchell

Moduły rejestrowania błędów i programy obsługi (ELMAH) oferują inne podejście do rejestrowania błędów środowiska uruchomieniowego w środowisku produkcyjnym. ELMAH to bezpłatna, open source biblioteka rejestrowania błędów, która zawiera funkcje, takie jak filtrowanie błędów i możliwość wyświetlania dziennika błędów ze strony internetowej, jako kanału informacyjnego RSS lub pobierania go jako pliku rozdzielanego przecinkami. Ten samouczek przeprowadzi Cię przez proces pobierania i konfigurowania usługi ELMAH.

Wprowadzenie

W poprzednim samouczku zbadano platformę ASP. System monitorowania kondycji platformy NET, który oferuje gotowe biblioteki do rejestrowania szerokiej gamy zdarzeń internetowych. Wielu deweloperów używa monitorowania kondycji do rejestrowania i wysyłania wiadomości e-mail ze szczegółami nieobsługiwanych wyjątków. Jednak istnieje kilka punktów bólu w tym systemie. Przede wszystkim brakuje jakiegokolwiek interfejsu użytkownika do wyświetlania informacji o zarejestrowanych zdarzeniach. Jeśli chcesz wyświetlić podsumowanie 10 ostatnich błędów lub wyświetlić szczegóły błędu, który wystąpił w zeszłym tygodniu, musisz przeskanować bazę danych, przeskanować skrzynkę odbiorczą wiadomości e-mail lub utworzyć stronę internetową, która wyświetla informacje z aspnet_WebEvent_Events tabeli.

Kolejny punkt bólu koncentruje się wokół złożoności monitorowania kondycji. Ponieważ monitorowanie kondycji może służyć do rejestrowania wielu różnych zdarzeń, a ponieważ istnieje wiele opcji poinstruowania, jak i kiedy są rejestrowane zdarzenia, prawidłowe skonfigurowanie systemu monitorowania kondycji może być uciążliwym zadaniem. Na koniec występują problemy ze zgodnością. Ponieważ monitorowanie kondycji zostało po raz pierwszy dodane do .NET Framework w wersji 2.0, nie jest dostępne dla starszych aplikacji internetowych utworzonych przy użyciu ASP.NET w wersji 1.x. Ponadto klasa użyta SqlWebEventProvider w poprzednim samouczku do rejestrowania szczegółów błędu w bazie danych działa tylko z bazami danych microsoft SQL Server. Należy utworzyć niestandardową klasę dostawcy dzienników, jeśli musisz rejestrować błędy w alternatywnym magazynie danych, takim jak plik XML lub baza danych Oracle.

Alternatywą dla systemu monitorowania kondycji jest moduły rejestrowania błędów i programy obsługi (ELMAH), bezpłatny system rejestrowania błędów typu open source utworzony przez Atif Aziz. Najbardziej godną uwagi różnicą między dwoma systemami jest możliwość wyświetlania listy błędów i szczegółów określonego błędu ze strony internetowej i kanału informacyjnego RSS. System ELMAH jest łatwiejszy do skonfigurowania niż monitorowanie kondycji, ponieważ rejestruje tylko błędy. Ponadto system ELMAH obejmuje obsługę ASP.NET 1.x, ASP.NET 2.0 i ASP.NET 3.5 aplikacji oraz dostarczanych z różnymi dostawcami źródeł dzienników.

W tym samouczku przedstawiono kroki związane z dodawaniem rozwiązania ELMAH do aplikacji ASP.NET. Zaczynamy!

Uwaga

System monitorowania kondycji i SYSTEM ELMAH mają własne zestawy zalet i wad. Zachęcam do wypróbowania obu systemów i podjęcia decyzji, co najlepiej odpowiada Twoim potrzebom.

Dodawanie aplikacji ELMAH do aplikacji internetowej ASP.NET

Integrowanie aplikacji ELMAH z nową lub istniejącą aplikacją ASP.NET jest łatwym i prostym procesem, który trwa poniżej pięciu minut. W skrócie obejmuje cztery proste kroki:

  1. Pobierz aplikację Elmah.dll ELMAH i dodaj zestaw do aplikacji internetowej.
  2. Rejestrowanie modułów HTTP i programu obsługi ELMAH w programie Web.config,
  3. Określanie opcji konfiguracji ELMAH i
  4. W razie potrzeby utwórz infrastrukturę źródła dziennika błędów.

Przyjrzyjmy się każdemu z tych czterech kroków, po jednym naraz.

Krok 1. Pobieranie plików projektu ELMAH i dodawanieElmah.dllich do aplikacji internetowej

ELMAH 1.0 BETA 3 (kompilacja 10617), najnowsza wersja w momencie pisania tego artykułu, jest zawarta w pobraniu dostępnym w tym samouczku. Alternatywnie możesz odwiedzić witrynę internetową ELMAH , aby pobrać najnowszą wersję lub pobrać kod źródłowy. Wyodrębnij plik ELMAH do folderu na pulpicie i znajdź plik zestawu ELMAH (Elmah.dll).

Uwaga

Plik Elmah.dll znajduje się w folderze pobieraniaBin, który zawiera podfoldery dla różnych wersji .NET Framework oraz kompilacji Release and Debug. Użyj kompilacji wydania dla odpowiedniej wersji platformy. Jeśli na przykład tworzysz aplikację internetową ASP.NET 3.5, skopiuj Elmah.dll plik z Bin\net-3.5\Release folderu .

Następnie otwórz program Visual Studio i dodaj zestaw do projektu, klikając prawym przyciskiem myszy nazwę witryny internetowej w Eksplorator rozwiązań i wybierając polecenie Dodaj odwołanie z menu kontekstowego. Spowoduje to wyświetlenie okna dialogowego Dodawanie odwołania. Przejdź do karty Przeglądaj i wybierz Elmah.dll plik. Ta akcja powoduje dodanie Elmah.dll pliku do folderu aplikacji Bin internetowej.

Uwaga

Typ Projekt aplikacji internetowej (WAP) nie pokazuje Bin folderu w Eksplorator rozwiązań. Zamiast tego wyświetla te elementy w folderze Odwołania.

Zestaw Elmah.dll zawiera klasy używane przez system ELMAH. Te klasy dzielą się na jedną z trzech kategorii:

  • Moduły HTTP — moduł HTTP to klasa, która definiuje programy obsługi zdarzeń dla HttpApplication zdarzeń, takich jak Error zdarzenie. ELMAH zawiera wiele modułów HTTP, z których trzy są najbardziej niemieckie:

    • ErrorLogModule — rejestruje nieobsługiwane wyjątki do źródła dziennika.
    • ErrorMailModule — wysyła szczegóły nieobsługiwanego wyjątku w wiadomości e-mail.
    • ErrorFilterModule — stosuje filtry określone przez deweloperów, aby określić, jakie wyjątki są rejestrowane i jakie są ignorowane.
  • Programy obsługi HTTP — program obsługi HTTP to klasa, która jest odpowiedzialna za generowanie znaczników dla określonego typu żądania. ElMAH zawiera programy obsługi HTTP, które renderują szczegóły błędu jako stronę internetową, jako źródło danych RSS lub jako plik rozdzielany przecinkami (CSV).

  • Źródła dzienników błędów — poza ramką ELMAH może rejestrować błędy w pamięci, do bazy danych microsoft SQL Server, do bazy danych programu Microsoft Access, do bazy danych Oracle, do pliku XML, do bazy danych SQLite lub do bazy danych Vista DB. Podobnie jak w przypadku systemu monitorowania kondycji architektura ELMAH została utworzona przy użyciu modelu dostawcy, co oznacza, że w razie potrzeby można tworzyć i bezproblemowo integrować własnych niestandardowych dostawców źródeł dzienników.

Krok 2. Rejestrowanie modułu HTTP i programu obsługi ELMAH

Elmah.dll Chociaż plik zawiera moduły HTTP i program obsługi wymagany do automatycznego rejestrowania nieobsługiwane wyjątki i wyświetlania szczegółów błędu ze strony internetowej, muszą one być jawnie zarejestrowane w konfiguracji aplikacji internetowej. Moduł ErrorLogModule HTTP, po zarejestrowaniu HttpApplication, subskrybuje zdarzenie .s Error . Za każdym razem, gdy to zdarzenie jest zgłaszane, ErrorLogModule rejestruje szczegóły wyjątku do określonego źródła dziennika. Zobaczymy, jak zdefiniować dostawcę źródła dziennika w następnej sekcji "Konfigurowanie elmAH". ErrorLogPageFactory Fabryka programu obsługi HTTP jest odpowiedzialna za generowanie znaczników podczas wyświetlania dziennika błędów ze strony internetowej.

Określona składnia rejestrowania modułów HTTP i programów obsługi zależy od serwera internetowego obsługującego witrynę. W przypadku programu ASP.NET Development Server i usług IIS firmy Microsoft w wersji 6.0 i starszych moduły HTTP i programy obsługi są rejestrowane w <httpModules> sekcjach i <httpHandlers> , które są wyświetlane w elemecie <system.web> . Jeśli używasz usług IIS 7.0, należy je zarejestrować w <system.webServer> sekcjach i <handlers> elementach<modules>. Na szczęście można zdefiniować moduły HTTP i programy obsługi w obu miejscach niezależnie od używanego serwera internetowego. Ta opcja jest najbardziej przenośna, ponieważ umożliwia użycie tej samej konfiguracji w środowiskach deweloperskich i produkcyjnych niezależnie od używanego serwera internetowego.

Rozpocznij od zarejestrowania modułu ErrorLogModule HTTP i ErrorLogPageFactory procedury obsługi HTTP w <httpModules> sekcji i <httpHandlers> w <system.web>sekcji . Jeśli konfiguracja już definiuje te dwa elementy, po prostu uwzględnij element modułu <add> HTTP i programu obsługi ELMAH.

<?xml version="1.0"?>
<configuration>
  ...
  
  <system.web>
  ...

  <httpHandlers>
  ...

  <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
  </httpHandlers>
  
  <httpModules>
  ...
  
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
  </httpModules>

  ...
  </system.web>

  ...
</configuration>

Następnie zarejestruj moduł HTTP i program obsługi ELMAH w elemecie <system.webServer> . Tak jak poprzednio, jeśli ten element nie jest jeszcze obecny w konfiguracji, dodaj go.

<?xml version="1.0"?>
<configuration>
  ...

  <system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules>
  ...

  <add name="Elmah.ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  </modules>
  <handlers>
  ...

  <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
  </handlers>
  </system.webServer>
</configuration>

Domyślnie usługi IIS 7 skarżą się, czy moduły HTTP i procedury obsługi są zarejestrowane w <system.web> sekcji . Atrybut validateIntegratedModeConfiguration w elemecie <validation> instruuje usługi IIS 7, aby pomijały takie komunikaty o błędach.

Należy pamiętać, że składnia rejestrowania ErrorLogPageFactory programu obsługi HTTP zawiera path atrybut , który jest ustawiony na elmah.axd. Ten atrybut informuje aplikację internetową, że jeśli żądanie zostanie dostarczone dla strony o nazwie elmah.axd , żądanie powinno zostać przetworzone przez ErrorLogPageFactory program obsługi HTTP. W dalszej części tego samouczka ErrorLogPageFactory zobaczymy program obsługi HTTP.

Krok 3. Konfigurowanie elmAH

ELMAH szuka opcji konfiguracji w pliku witryny internetowej Web.config w sekcji konfiguracji niestandardowej o nazwie <elmah>. Aby można było użyć sekcji niestandardowej w Web.config nim, należy najpierw zdefiniować element <configSections> . Web.config Otwórz plik i dodaj następujący znacznik do pliku <configSections>:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
  ...

  <sectionGroup name="elmah">
  <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
  <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
  <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
  <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
  </sectionGroup>
  </configSections>

  ...
</configuration>

Uwaga

Jeśli konfigurujesz elmAH dla aplikacji ASP.NET 1.x, usuń requirePermission="false" atrybut z powyższych <section> elementów.

Powyższa składnia rejestruje sekcję niestandardową <elmah> i jej podsekcje: <security>, <errorLog>, <errorMail>i <errorFilter>.

Następnie dodaj sekcję <elmah> do Web.config. Ta sekcja powinna być wyświetlana <system.web> na tym samym poziomie co element. <elmah> W sekcji dodaj sekcje <security> i <errorLog> w następujący sposób:

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  <security allowRemoteAccess="0" />
  
  <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="ReviewsConnectionString" />
  </elmah>

  ...
</configuration>

Atrybut <security> sekcji allowRemoteAccess wskazuje, czy dostęp zdalny jest dozwolony. Jeśli ta wartość jest ustawiona na 0, można wyświetlić stronę internetową dziennika błędów tylko lokalnie. Jeśli ten atrybut jest ustawiony na 1, strona internetowa dziennika błędów jest włączona zarówno dla gości zdalnych, jak i lokalnych. Na razie wyłączmy stronę internetową dziennika błędów dla odwiedzających zdalnych. Umożliwimy dostęp zdalny później, gdy będziemy mieli możliwość omówienia kwestii związanych z zabezpieczeniami.

Sekcja <errorLog> definiuje źródło dziennika błędów, które określa, gdzie są rejestrowane szczegóły błędu. Jest ona podobna do <providers> sekcji w systemie monitorowania kondycji. Powyższa składnia określa klasę SqlErrorLog jako źródło dziennika błędów, które rejestruje błędy w bazie danych microsoft SQL Server określonej przez wartość atrybutuconnectionStringName.

Uwaga

Program ELMAH jest dostarczany z dodatkowymi dostawcami dzienników błędów, których można użyć do rejestrowania błędów w pliku XML, bazie danych programu Microsoft Access, bazie danych Oracle i innych magazynach danych. Zapoznaj się z przykładowym Web.config plikiem dołączonym do pobierania ELMAH, aby uzyskać informacje na temat korzystania z tych alternatywnych dostawców dziennika błędów.

Krok 4. Tworzenie infrastruktury źródła dziennika błędów

Dostawca ELMAH SqlErrorLog rejestruje szczegóły błędu dla określonej bazy danych microsoft SQL Server. Dostawca SqlErrorLog oczekuje, że ta baza danych ma tabelę o nazwie ELMAH_Error i trzy procedury składowane: ELMAH_GetErrorsXml, ELMAH_GetErrorXmli ELMAH_LogError. Pobieranie ELMAH zawiera plik o nazwie SQLServer.sql w db folderze, który zawiera język T-SQL do tworzenia tej tabeli i tych procedur składowanych. Aby użyć dostawcy SqlErrorLog , należy uruchomić te instrukcje w bazie danych.

Na rysunkach 1 i 2 przedstawiono Eksploratora baz danych w programie Visual Studio po dodaniu obiektów bazy danych wymaganych przez dostawcę SqlErrorLog .

Zrzut ekranu przedstawiający błędy dostawcy dziennika błędów języka S Q L zapisane w tabeli.

Rysunek 1. Dzienniki SqlErrorLog błędów dostawcy w ELMAH_Error tabeli

Zrzut ekranu przedstawiający sposób używania trzech procedur składowanych przez dostawcę dziennika błędów języka S Q L.

Rysunek 2. SqlErrorLog Dostawca używa trzech procedur składowanych

ELMAH w akcji

W tym momencie dodaliśmy elMAH do aplikacji internetowej, zarejestrowaliśmy ErrorLogModule moduł HTTP i ErrorLogPageFactory program obsługi HTTP, określono opcje konfiguracji ELMAH w systemie Web.configi dodano wymagane obiekty bazy danych dla SqlErrorLog dostawcy dziennika błędów. Teraz jesteśmy gotowi zobaczyć ELMAH w akcji! Odwiedź witrynę internetową Recenzje książek i odwiedź stronę, która generuje błąd środowiska uruchomieniowego, taki jak Genre.aspx?ID=foo, lub nieistniejącej strony, takiej jak NoSuchPage.aspx. To, co widzisz podczas odwiedzania tych stron, <customErrors> zależy od konfiguracji i od tego, czy odwiedzasz lokalnie, czy zdalnie. (Wróć do samouczka Wyświetlanie niestandardowej strony błędu, aby zapoznać się z modułem odświeżania w tym temacie).

ELMAH nie ma wpływu na zawartość wyświetlaną użytkownikowi w przypadku wystąpienia nieobsługiwanego wyjątku; po prostu rejestruje jego szczegóły. Ten dziennik błędów jest dostępny ze strony elmah.axd internetowej z katalogu głównego witryny internetowej, na przykład http://localhost/BookReviews/elmah.axd. (Ten plik nie istnieje fizycznie w projekcie, ale gdy żądanie przychodzi do elmah.axd środowiska uruchomieniowego, wysyła je do ErrorLogPageFactory programu obsługi HTTP, co generuje znaczniki wysyłane z powrotem do przeglądarki).

Uwaga

Możesz również użyć strony, elmah.axd aby poinstruować ELMAH o wygenerowaniu błędu testowego. Odwiedzanie elmah.axd/test (jak w programie ), powoduje, http://localhost/BookReviews/elmah.axd/testże ELMAH zgłasza wyjątek typu Elmah.TestException, który ma komunikat o błędzie: "Jest to wyjątek testowy, który można bezpiecznie zignorować".

Rysunek 3 przedstawia dziennik błędów podczas odwiedzania elmah.axd środowiska deweloperskiego.

Zrzut ekranu przedstawiający sposób wyświetlania dziennika błędów na stronie internetowej.

Rysunek 3. Elmah.axd Wyświetla dziennik błędów ze strony internetowej
(Kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Dziennik błędów na rysunku 3 zawiera sześć wpisów błędów. Każdy wpis zawiera kod stanu HTTP (404 lub 500, dla tych błędów), typ, opis, nazwę zalogowanego użytkownika, gdy wystąpił błąd, oraz datę i godzinę. Kliknięcie linku Szczegóły powoduje wyświetlenie strony zawierającej ten sam komunikat o błędzie widoczny w żółtym ekranie śmierci Szczegóły błędu (zobacz Rysunek 4) wraz z wartościami zmiennych serwera w momencie wystąpienia błędu (zobacz Rysunek 5). Można również wyświetlić nieprzetworzone dane XML, w których są zapisywane szczegóły błędu, w tym dodatkowe informacje, takie jak wartości w nagłówku HTTP POST.

Zrzut ekranu przedstawiający szczegóły błędu YSOD.

Rysunek 4. Wyświetlanie szczegółów błędu YSOD
(Kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Zrzut ekranu przedstawiający wartości kolekcji zmiennych serwera.

Rysunek 5. Eksplorowanie wartości kolekcji zmiennych serwera w momencie wystąpienia błędu
(Kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Wdrażanie rozwiązania ELMAH w produkcyjnej witrynie internetowej obejmuje:

  • Elmah.dll Kopiowanie pliku do Bin folderu w środowisku produkcyjnym
  • Kopiowanie ustawień konfiguracji specyficznych dla elMAH do pliku używanego Web.config w środowisku produkcyjnym i
  • Dodawanie infrastruktury źródła dziennika błędów do produkcyjnej bazy danych.

W poprzednich samouczkach omówiliśmy techniki kopiowania plików z programowania do środowiska produkcyjnego. Być może najprostszym sposobem uzyskania infrastruktury źródła dziennika błędów w produkcyjnej bazie danych jest użycie SQL Server Management Studio do nawiązania połączenia z produkcyjną bazą danych, a następnie wykonanie pliku skryptuSqlServer.sql, który utworzy wymaganą tabelę i procedury składowane.

Wyświetlanie strony szczegółów błędu w środowisku produkcyjnym

Po wdrożeniu witryny w środowisku produkcyjnym odwiedź produkcyjną witrynę internetową i wygeneruj nieobsługiwany wyjątek. Podobnie jak w środowisku projektowym elMAH nie ma wpływu na stronę błędu wyświetlaną w przypadku wystąpienia nieobsługiwanego wyjątku; Zamiast tego tylko rejestruje błąd. Jeśli spróbujesz odwiedzić stronę dziennika błędów (elmah.axd) ze środowiska produkcyjnego, zostanie wyświetlona strona Zabronione pokazana na rysunku 6.

Zrzut ekranu pokazujący, że odwiedzający zdalni nie mogą wyświetlić strony internetowej dziennika błędów.

Rysunek 6. Domyślnie odwiedzający zdalni nie mogą wyświetlić strony sieci Web dziennika błędów
(Kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Pamiętaj, że w sekcji konfiguracji <security> ELMAH ustawiliśmy allowRemoteAccess atrybut na 0, co uniemożliwia użytkownikom zdalnym wyświetlanie dziennika błędów. Ważne jest, aby uniemożliwić anonimowym odwiedzającym wyświetlanie dziennika błędów, ponieważ szczegóły błędu mogą ujawnić luki w zabezpieczeniach lub inne poufne informacje. Jeśli zdecydujesz się ustawić ten atrybut na 1 i włączyć zdalny dostęp do dziennika błędów, ważne jest zablokowanie elmah.axd ścieżki tak, aby tylko autoryzowani odwiedzający mogli uzyskać do niego dostęp. Można to osiągnąć, dodając <location> element do Web.config pliku.

Poniższa konfiguracja zezwala tylko użytkownikom w roli Administracja na dostęp do strony internetowej dziennika błędów:

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  <security allowRemoteAccess="1" />
  
  ...
  </elmah>

  ...

  <location path="elmah.axd">
  <system.web>
  <authorization>
  <allow roles="Admin" />
  <deny users="*" />
  </authorization>
  </system.web>  
  </location>
</configuration>

Uwaga

Rola Administracja i trzech użytkowników w systemie — Scott, Jisun i Alice — zostały dodane w samouczku Konfigurowanie witryny internetowej korzystającej z usług aplikacji. Użytkownicy Scott i Jisun są członkami roli Administracja. Aby uzyskać więcej informacji na temat uwierzytelniania i autoryzacji, zapoznaj się z moimi samouczkami dotyczącymi zabezpieczeń witryny internetowej.

Dziennik błędów w środowisku produkcyjnym może być teraz wyświetlany przez użytkowników zdalnych. Zapoznaj się z ilustracjami 3, 4 i 5 , aby zapoznać się ze zrzutami ekranu strony internetowej dziennika błędów. Jeśli jednak użytkownik anonimowy lub inny niż Administracja próbuje wyświetlić stronę dziennika błędów, zostanie automatycznie przekierowana do strony logowania (Login.aspx), jak pokazano na rysunku 7.

Zrzut ekranu pokazujący, jak nieautoryzowani użytkownicy są automatycznie przekierowywani do strony logowania.

Rysunek 7. Nieautoryzowani użytkownicy są automatycznie przekierowywani do strony logowania
(Kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Błędy rejestrowania programowego

Moduł HTTP ELMAH ErrorLogModule automatycznie rejestruje nieobsługiwane wyjątki do określonego źródła dziennika. Alternatywnie możesz zarejestrować błąd bez konieczności zgłaszania nieobsługiwanego wyjątku ErrorSignal przy użyciu klasy i jej Raise metody. Metoda Raise jest przekazywana Exception do obiektu i rejestruje go tak, jakby ten wyjątek został zgłoszony i dotarł do środowiska uruchomieniowego ASP.NET bez obsługi. Różnica polega jednak na tym, że żądanie kontynuuje normalne wykonywanie po Raise wywołaniu metody, podczas gdy zgłoszony, nieobsługiwany wyjątek przerywa normalne wykonywanie żądania i powoduje, że środowisko uruchomieniowe ASP.NET wyświetli skonfigurowaną stronę błędu.

Klasa ErrorSignal jest przydatna w sytuacjach, gdy istnieje pewna akcja, która może zakończyć się niepowodzeniem, ale jej awaria nie jest katastrofalna dla ogólnej operacji wykonywanej. Na przykład witryna internetowa może zawierać formularz, który przyjmuje dane wejściowe użytkownika, przechowuje go w bazie danych, a następnie wysyła użytkownikowi wiadomość e-mail z informacją o przetworzeniu informacji. Co się stanie, jeśli informacje zostaną pomyślnie zapisane w bazie danych, ale podczas wysyłania wiadomości e-mail wystąpi błąd? Jedną z opcji jest zgłoszenie wyjątku i wysłanie użytkownika na stronę błędu. Może to jednak mylić użytkownika z myśleniem, że wprowadzone informacje nie zostały zapisane. Innym podejściem jest zarejestrowanie błędu związanego z pocztą e-mail, ale nie zmiana środowiska użytkownika w żaden sposób. W tym miejscu przydaje ErrorSignal się klasa.

// ... Save user's information to the database ...
...

// Attempt to send the user a confirmation email
try
{
    // ... Send an email ...
}
catch (Exception e)
{
    // Error in sending email. Log it!
    ErrorSignal.FromCurrentContext().Raise(e);
}

Powiadomienie o błędzie za pośrednictwem Email

Oprócz błędów rejestrowania w bazie danych elMAH można również skonfigurować pod kątem szczegółów błędu wiadomości e-mail do określonego adresata. Ta funkcja jest udostępniana ErrorMailModule przez moduł HTTP, dlatego należy zarejestrować ten moduł HTTP w Web.config celu wysłania szczegółów błędu za pośrednictwem poczty e-mail.

<?xml version="1.0"?>
<configuration>
  ...
  
  <system.web>
  ...

  <httpModules>
  ...
  
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
  <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah"/>
  </httpModules>
  </system.web>

  <system.webServer>
  <validation validateIntegratedModeConfiguration="false"/>
  <modules>
  ...

  <add name="Elmah.ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  <add name="Elmah.ErrorMail" type="Elmah.ErrorMailModule" preCondition="managedHandler" />
  </modules>
  
  ...
  </system.webServer>
</configuration>

Następnie określ informacje o wiadomości e-mail o błędzie w <elmah> sekcji elementu <errorMail> , wskazując nadawcę i adresata wiadomości e-mail, temat oraz informację o tym, czy wiadomość e-mail jest wysyłana asynchronicznie.

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  ...

  <errorMail from="support@example.com"
  to="support@example.com"
  subject="Book Reviews Runtime Error"
  async="true" />
  </elmah>

  ...
</configuration>

Po utworzeniu powyższych ustawień za każdym razem, gdy wystąpi błąd środowiska uruchomieniowego ELMAH wysyła wiadomość e-mail ze support@example.com szczegółami błędu. Wiadomość e-mail dotycząca błędu ELMAH zawiera te same informacje, które są wyświetlane na stronie internetowej szczegółów błędu, a mianowicie komunikat o błędzie, ślad stosu i zmienne serwera (zapoznaj się z ilustracjami 4 i 5). Wiadomość e-mail o błędzie zawiera również zawartość Yellow Screen of Death szczegóły wyjątku jako załącznik (YSOD.html).

Rysunek 8 przedstawia wiadomość e-mail o błędzie ELMAH wygenerowaną przez stronę Genre.aspx?ID=foo. Chociaż rysunek 8 przedstawia tylko komunikat o błędzie i ślad stosu, zmienne serwera są uwzględniane w treści wiadomości e-mail.

Zrzut ekranu pokazujący, że można skonfigurować usługę ELMAH do wysyłania szczegółów błędu za pośrednictwem poczty e-mail.

Rysunek 8. Możesz skonfigurować elmAH do wysyłania szczegółów błędu za pośrednictwem Email
(Kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Tylko rejestrowanie interesujących cię błędów

Domyślnie ELMAH rejestruje szczegóły każdego nieobsługiwanego wyjątku, w tym błędy 404 i inne błędy HTTP. Możesz poinstruować ELMAH, aby zignorował te lub inne typy błędów przy użyciu filtrowania błędów. Logika filtrowania jest wykonywana ErrorFilterModule przez moduł HTTP ELMAH, który należy zarejestrować w Web.config celu użycia logiki filtrowania. Reguły filtrowania są określone w <errorFilter> sekcji .

Poniższe znaczniki instruują ELMAH, aby nie rejestrowała błędów 404.

<?xml version="1.0"?>
<configuration>
  ...

  <elmah>
  ...

  <errorFilter>
  <test>
  <equal binding="HttpStatusCode" value="404" type="Int32" />
  </test>
  </errorFilter>
  </elmah>

  ...
</configuration>

Uwaga

Nie zapomnij, aby użyć filtrowania ErrorFilterModule błędów, należy zarejestrować moduł HTTP.

Element <equal> wewnątrz <test> sekcji jest nazywany asercją. Jeśli asercji daje wartość true, błąd jest filtrowany z dziennika ELMAH. Dostępne są inne asercji, w tym: <greater>, <greater-or-equal>, <not-equal>, <lesser>, , <lesser-or-equal>itd. Można również łączyć asercji przy użyciu operatorów logicznych <and> i <or> . Co więcej, możesz nawet dołączyć proste wyrażenie Języka JavaScript jako asercję lub napisać własne asercje w języku C# lub Visual Basic.

Aby uzyskać więcej informacji na temat możliwości filtrowania błędów ELMAH, zapoznaj się z sekcją Filtrowanie błędów w artykułach ELMAH.

Podsumowanie

ELMAH zapewnia prosty, ale zaawansowany mechanizm rejestrowania błędów w aplikacji internetowej ASP.NET. Podobnie jak system monitorowania kondycji firmy Microsoft, SYSTEM ELMAH może rejestrować błędy w bazie danych i wysyłać szczegóły błędu do dewelopera za pośrednictwem poczty e-mail. W przeciwieństwie do systemu monitorowania kondycji system ELMAH obejmuje gotowe do użycia obsługę szerszego zakresu magazynów danych dziennika błędów, w tym: Microsoft SQL Server, Microsoft Access, Oracle, pliki XML i kilka innych. Ponadto SYSTEM ELMAH oferuje wbudowany mechanizm wyświetlania dziennika błędów oraz szczegółowe informacje o określonym błędzie ze strony internetowej. elmah.axd Strona elmah.axd może również renderować informacje o błędach jako źródło danych RSS lub jako plik wartości rozdzielanych przecinkami (CSV), który można odczytać przy użyciu programu Microsoft Excel. Można również poinstruować ELMAH, aby filtrować błędy z dziennika przy użyciu asercji deklaratywnych lub programowych. System ELMAH może być używany z aplikacjami ASP.NET w wersji 1.x.

Każda wdrożona aplikacja powinna mieć mechanizm automatycznego rejestrowania nieobsługiwanych wyjątków i wysyłania powiadomień do zespołu deweloperów. Niezależnie od tego, czy jest to realizowane przy użyciu monitorowania kondycji, czy ELMAH jest pomocnicze. Innymi słowy, nie ma znaczenia, czy używasz monitorowania kondycji, czy ELMAH; oceń oba systemy, a następnie wybierz ten, który najlepiej odpowiada Twoim potrzebom. Zasadniczo ważne jest, aby w środowisku produkcyjnym rejestrować nieobsługiwane wyjątki.

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: