Sdílet prostřednictvím


Protokolování podrobností o chybách pomocí monitorování stavu v ASP.NET (VB)

Scott Mitchell

Systém microsoftu pro monitorování stavu poskytuje snadný a přizpůsobitelný způsob protokolování různých webových událostí, včetně neošetřených výjimek. Tento kurz vás provede nastavením systému monitorování stavu pro protokolování neošetřených výjimek do databáze a upozorňovat vývojáře prostřednictvím e-mailové zprávy.

Úvod

Protokolování je užitečný nástroj pro monitorování stavu nasazené aplikace a pro diagnostiku případných problémů. Zvlášť důležité je protokolovat chyby, ke kterým dochází v nasazené aplikaci, aby bylo možné je napravit. Událost Error je vyvolána vždy, když dojde k neošetřené výjimce v aplikaci ASP.NET; předchozí kurz ukázal, jak upozornit vývojáře na chybu a protokolovat její podrobnosti vytvořením obslužné rutiny události pro Error událost. Vytvoření Error obslužné rutiny události pro protokolování podrobností o chybě a upozornění vývojáře je zbytečné, protože tuto úlohu může provádět ASP. Systém monitorování stavu technologie NET.

Systém monitorování stavu byl zaveden v ASP.NET 2.0 a je navržený tak, aby monitoroval stav nasazené aplikace ASP.NET protokolováním událostí, ke kterým dochází během životnosti aplikace nebo požadavku. Události protokolované systémem monitorování stavu se označují jako události monitorování stavu nebo webové události a zahrnují:

  • Události životnosti aplikace, například při spuštění nebo zastavení aplikace
  • Události zabezpečení, včetně neúspěšných pokusů o přihlášení a neúspěšných žádostí o autorizaci adres URL
  • Chyby aplikace, včetně neošetřených výjimek, zobrazení výjimek analýzy stavu, výjimek ověření požadavků a chyb kompilace, mimo jiné typů chyb.

Při vyvolání události monitorování stavu je možné protokolovat do libovolného počtu zadaných zdrojů protokolů. Systém monitorování stavu se dodává se zdroji protokolů, které protokolují webové události do databáze Microsoft SQL Serveru, do protokolu událostí systému Windows nebo prostřednictvím e-mailové zprávy. Můžete také vytvořit vlastní zdroje protokolů.

Události, které protokoly systému monitorování stavu spolu s použitými zdroji protokolů jsou definovány v Web.config. Pomocí několika řádků značek konfigurace můžete pomocí monitorování stavu protokolovat všechny neošetřené výjimky do databáze a upozornit vás na výjimku e-mailem.

Prozkoumání konfigurace systému Monitorování stavu

Chování systému monitorování stavu je definováno jeho konfiguračními informacemi, které jsou umístěny v <healthMonitoring> prvku v Web.config. Tato část konfigurace mimo jiné definuje následující tři důležité informace:

  1. Události monitorování stavu, které by se při vyvolání měly protokolovat,
  2. Zdroje protokolů a
  3. Způsob mapování jednotlivých událostí monitorování stavu definovaných v (1) na zdroje protokolů definované v (2).

Tyto informace jsou zadány prostřednictvím tří podřízených konfiguračních prvků: <eventMappings>, <providers>a <rules>, v uvedeném pořadí.

Výchozí informace o konfiguraci systému monitorování stavu najdete v souboru ve Web.config %WINDIR%\Microsoft.NET\Framework\version\CONFIG složce. Tyto výchozí informace o konfiguraci s odebráním některých značek pro stručnost jsou uvedené níže:

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

Události monitorování stavu, které jsou zajímavé, jsou definovány v <eventMappings> prvku, který poskytuje popisný název třídy událostí monitorování stavu. Ve výše uvedeném <eventMappings> kódu přiřadí prvek popisný název "Všechny chyby" k událostem monitorování stavu typu WebBaseErrorEvent a název Audity selhání událostem monitorování stavu typu WebFailureAuditEvent.

Tento <providers> prvek definuje zdroje protokolů a dává jim popisný název a zadá všechny informace o konfiguraci specifické pro zdroj protokolu. První <add> prvek definuje zprostředkovatele EventLogProvider, který protokoluje zadané události monitorování stavu pomocí EventLogWebEventProvider třídy. Třída EventLogWebEventProvider protokoluje událost do protokolu událostí systému Windows. Druhý <add> element definuje zprostředkovatele SqlWebEventProvider, který protokoluje události do databáze Microsoft SQL Serveru prostřednictvím SqlWebEventProvider třídy. Konfigurace SqlWebEventProvider určuje připojovací řetězec databáze (connectionStringName) mimo jiné možnosti konfigurace.

Element <rules> mapuje události zadané v elementu <eventMappings> tak, aby protokolovat zdroje v elementu <providers> . Ve výchozím nastavení ASP.NET webové aplikace protokolují všechny neošetřené výjimky a selhání auditu do protokolu událostí systému Windows.

Protokolování událostí do databáze

Výchozí konfiguraci systému monitorování stavu je možné přizpůsobit podle webové aplikace tak, že do souboru aplikace Web.config přidáte <healthMonitoring> oddíl. Pomocí elementu <eventMappings><providers>můžete zahrnout další prvky v , a <rules> oddíly<add>. Pokud chcete odebrat nastavení z výchozí konfigurace, použijte <remove> element nebo použijte <clear /> k odebrání všech výchozích hodnot z některé z těchto částí. Pojďme nakonfigurovat webovou aplikaci Kontrola knih tak, aby protokoloval všechny neošetřené výjimky do databáze Microsoft SQL Serveru pomocí SqlWebEventProvider této třídy.

Třída SqlWebEventProvider je součástí systému monitorování stavu a protokoluje událost monitorování stavu do zadané databáze SQL Serveru. Třída SqlWebEventProvider očekává, že zadaná databáze obsahuje uloženou proceduru s názvem aspnet_WebEvent_LogEvent. Tato uložená procedura se předává podrobnosti události a má za úkol uložit podrobnosti události. Dobrou zprávou je, že pro uložení podrobností o události nemusíte vytvářet tuto uloženou proceduru ani tabulku. Tyto objekty můžete do databáze přidat pomocí aspnet_regsql.exe nástroje.

Poznámka:

Nástroj aspnet_regsql.exe byl popsán zpět v části Konfigurace webu, který používá kurz Aplikační služby při přidání podpory pro ASP. Aplikační služby net. V důsledku toho databáze webu Book Reviews již obsahuje uloženou proceduru aspnet_WebEvent_LogEvent , která ukládá informace o události do tabulky s názvem aspnet_WebEvent_Events.

Jakmile máte do databáze přidanou potřebnou uloženou proceduru a tabulku, vše, co zbývá, je instruovat monitorování stavu k protokolování všech neošetřených výjimek do databáze. Dosáhnete toho tak, že do souboru webu Web.config přidáte následující kód:

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

Výše uvedený kód konfigurace monitorování stavu používá <clear /> prvky k vymazání předem definovaných informací o konfiguraci monitorování stavu z oddílu <providers><eventMappings>a <rules> . Potom přidá jednu položku do každého z těchto oddílů.

  • Element <eventMappings> definuje jednu událost monitorování stavu s názvem "Všechny chyby", která je vyvolána vždy, když dojde k neošetřené výjimce.
  • Element <providers> definuje jeden zdroj protokolu s názvem "SqlWebEventProvider", který používá SqlWebEventProvider třídu. Atribut connectionStringName byl nastaven na "ReviewsConnectionString", což je název naší připojovací řetězec definován v oddílu<connectionStrings>.
  • Nakonec element rules> označuje, <že když se událost All Errors překládá, že by měla být zaznamenána pomocí zprostředkovatele SqlWebEventProvider.

Tyto informace o konfiguraci dávají systému monitorování stavu pokyn, aby protokoloval všechny neošetřené výjimky do databáze Kontroly knih.

Poznámka:

Událost je vyvolána pouze u chyb serveru. Nevyvolá WebBaseErrorEvent se u chyb HTTP, jako je například požadavek na ASP.NET prostředek, který nebyl nalezen. To se liší od chování HttpApplication události třídy Error , která je vyvolána pro chyby serveru i PROTOKOLU HTTP.

Pokud chcete zobrazit systém monitorování stavu v akci, navštivte web a vygenerujte chybu za běhu na Genre.aspx?ID=fooadrese . Měla by se zobrazit příslušná chybová stránka – buď žlutá obrazovka s podrobnostmi o výjimce smrti (při návštěvě místně) nebo na vlastní chybovou stránku (při návštěvě webu v produkčním prostředí). Systém monitorování stavu zaprotokoloval do databáze informace o chybě. V tabulce by měl být jeden záznam aspnet_WebEvent_Events (viz obrázek 1). Tento záznam obsahuje informace o chybě za běhu, ke které právě došlo.

Snímek obrazovky s podrobnostmi o chybě, které byly zaprotokolovány do tabulky

Obrázek 1: Podrobnosti o chybě byly zaprotokolovány do aspnet_WebEvent_Events tabulky
(Kliknutím zobrazíte obrázek s plnou velikostí.

Zobrazení protokolu chyb na webové stránce

S aktuální konfigurací webu protokoluje systém monitorování stavu všechny neošetřené výjimky databáze. Monitorování stavu ale neposkytuje žádný mechanismus pro zobrazení protokolu chyb prostřednictvím webové stránky. Můžete ale vytvořit ASP.NET stránku, která zobrazí tyto informace z databáze. (Jak uvidíme v tuto chvíli, můžete se rozhodnout, že se vám v e-mailové zprávě odešlou podrobnosti o chybě.)

Pokud takovou stránku vytvoříte, nezapomeňte provést kroky, které umožní zobrazení podrobností o chybě jenom autorizovaným uživatelům. Pokud váš web již využívá uživatelské účty, můžete pomocí autorizačních pravidel adresy URL omezit přístup na stránku určitým uživatelům nebo rolím. Další informace o tom, jak udělit nebo omezit přístup k webovým stránkám na základě přihlášeného uživatele, najdete v kurzech zabezpečení webu.

Poznámka:

V dalším kurzu se seznámíte s alternativním systémem protokolování chyb a oznámení s názvem ELMAH. ELMAH obsahuje integrovaný mechanismus pro zobrazení protokolu chyb z webové stránky i jako informační kanál RSS.

Protokolování událostí do e-mailu

Systém monitorování stavu obsahuje poskytovatele zdroje protokolů, který "protokoluje" událost do e-mailové zprávy. Zdroj protokolu obsahuje stejné informace, které se protokolují do databáze v textu e-mailové zprávy. Tento zdroj protokolů můžete použít k upozornění vývojáře, když dojde k určité události monitorování stavu.

Pojďme aktualizovat konfiguraci webu Recenze knih, abychom dostali e-mail, kdykoli dojde k výjimce. Abychom toho dosáhli, musíme provést tři úlohy:

  1. Nakonfigurujte webovou aplikaci ASP.NET tak, aby odesílala e-maily. Toho se dosahuje zadáním způsobu odesílání e-mailových zpráv prostřednictvím konfiguračního <system.net> prvku. Další informace o odesílání e-mailových zpráv v aplikaci ASP.NET najdete v tématu Odesílání e-mailů v ASP.NET a System.Net.Mail.
  2. Zaregistrujte poskytovatele zdroje e-mailového protokolu v elementu <providers> a
  3. Přidejte položku do elementu <rules> , který mapuje událost Všechny chyby na zprostředkovatele zdroje protokolu přidaného v kroku (2).

Systém monitorování stavu obsahuje dvě třídy poskytovatele zdrojového e-mailového protokolu: SimpleMailWebEventProvider a TemplatedMailWebEventProvider. Třída SimpleMailWebEventProvider odešle e-mailovou zprávu ve formátu prostého textu, která obsahuje podrobnosti o události a poskytuje malé přizpůsobení textu e-mailu. S TemplatedMailWebEventProvider třídou zadáte ASP.NET stránku, jejíž vykreslené revize se použije jako text e-mailové zprávy. Třída TemplatedMailWebEventProvider poskytuje mnohem větší kontrolu nad obsahem a formátem e-mailové zprávy, ale vyžaduje trochu více práce předem, protože musíte vytvořit ASP.NET stránku, která generuje text e-mailové zprávy. Tento kurz se zaměřuje na používání SimpleMailWebEventProvider třídy.

Aktualizujte prvek systému <providers> monitorování stavu v Web.config souboru tak, aby zahrnoval zdroj protokolu pro SimpleMailWebEventProvider třídu:

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

Výše uvedený kód používá SimpleMailWebEventProvider třídu jako poskytovatele zdroje protokolu a přiřadí ji popisný název "EmailWebEventProvider". Kromě toho <add> atribut obsahuje další možnosti konfigurace, jako je adresa To a From e-mailové zprávy.

Když je zdroj e-mailového protokolu definovaný, vše, co zbývá, je instruovat systém monitorování stavu, aby tento zdroj použil k neošetřené výjimce protokolu. Toho dosáhnete přidáním nového pravidla do oddílu <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>

Oddíl <rules> teď obsahuje dvě pravidla. První z nich s názvem Všechny chyby k odeslání e-mailu odešle všechny neošetřené výjimky do zdroje protokolu EmailWebEventProvider. Toto pravidlo má vliv na odesílání podrobností o chybách na webu na zadanou adresu To. Pravidlo Všechny chyby do databáze protokoluje podrobnosti o chybě do databáze lokality. V důsledku toho se při každé neošetřené výjimce na webu zaprotokolují do databáze a odešlou se na zadanou e-mailovou adresu.

Obrázek 2 ukazuje e-mail vygenerovaný SimpleMailWebEventProvider třídou při návštěvě Genre.aspx?ID=foo.

Snímek obrazovky znázorňující podrobnosti odeslané v e-mailové zprávě

Obrázek 2: Podrobnosti o chybě se posílají v e-mailové zprávě
(Kliknutím zobrazíte obrázek s plnou velikostí.

Shrnutí

Systém monitorování stavu ASP.NET je navržený tak, aby správcům umožňoval monitorovat stav nasazené webové aplikace. Události monitorování stavu se vyvolá, když se určité akce rozbalí, například když se aplikace zastaví, když se uživatel úspěšně přihlásí k lokalitě nebo když dojde k neošetřené výjimce. Tyto události lze protokolovat do libovolného počtu zdrojů protokolů. Tento kurz ukázal, jak protokolovat podrobnosti neošetřených výjimek do databáze a e-mailovou zprávou.

Tento kurz se zaměřuje na použití monitorování stavu k protokolování neošetřených výjimek, ale mějte na paměti, že monitorování stavu je navržené tak, aby změřilo celkový stav nasazené aplikace ASP.NET a zahrnuje řadu událostí monitorování stavu a zdrojů protokolů, které zde nejsou prozkoumány. Kromě toho můžete vytvořit vlastní události monitorování stavu a zdroje protokolů, pokud by to mělo být potřeba. Pokud se chcete dozvědět více o monitorování stavu, je dobrým prvním krokem přečíst si nejčastější dotazy k monitorování stavu Erika Reitana. Postupujte podle pokynů v tématu Postupy: Použití Monitorování stavu v ASP.NET 2.0.

Šťastné programování!

Další čtení

Další informace o tématech probíraných v tomto kurzu najdete v následujících zdrojích informací: