Registrazione dei dettagli degli errori con il monitoraggio dell'integrità di ASP.NET (C#)

di Scott Mitchell

Il sistema di monitoraggio dell'integrità di Microsoft offre un modo semplice e personalizzabile per registrare vari eventi Web, tra cui eccezioni non gestite. Questa esercitazione illustra come configurare il sistema di monitoraggio dell'integrità per registrare eccezioni non gestite in un database e inviare notifiche agli sviluppatori tramite un messaggio di posta elettronica.

Introduzione

La registrazione è uno strumento utile per monitorare l'integrità di un'applicazione distribuita e per diagnosticare eventuali problemi che potrebbero verificarsi. È particolarmente importante registrare gli errori che si verificano in un'applicazione distribuita in modo che possano essere risolti. L'evento viene generato ogni volta che si verifica un'eccezione non gestita in un'applicazione ASP.NET. L'esercitazioneError precedente ha illustrato come inviare una notifica a uno sviluppatore di un errore e registrarne i dettagli creando un gestore eventi per l'eventoError. Tuttavia, la creazione di un Error gestore eventi per registrare i dettagli dell'errore e notificare che uno sviluppatore non è necessario, in quanto questa attività può essere eseguita da ASP. Sistema di monitoraggio dell'integrità di NET.

Il sistema di monitoraggio dell'integrità è stato introdotto in ASP.NET 2.0 ed è progettato per monitorare l'integrità di un'applicazione ASP.NET distribuita registrando eventi che si verificano durante la durata dell'applicazione o della richiesta. Gli eventi registrati dal sistema di monitoraggio dell'integrità sono definiti eventi di monitoraggio dell'integrità o eventi Web e includono:

  • Eventi di durata dell'applicazione, ad esempio quando un'applicazione viene avviata o arrestata
  • Eventi di sicurezza, inclusi tentativi di accesso non riusciti e richieste di autorizzazione URL non riuscite
  • Errori dell'applicazione, inclusi eccezioni non gestite, analizzare le eccezioni sullo stato, richiedere eccezioni di convalida e errori di compilazione, tra altri tipi di errori.

Quando viene generato un evento di monitoraggio dell'integrità, può essere registrato in qualsiasi numero di origini di log specificate. Il sistema di monitoraggio dell'integrità viene fornito con origini di log che registrano gli eventi Web in un database di Microsoft SQL Server, nel registro eventi di Windows o tramite un messaggio di posta elettronica, tra gli altri. È anche possibile creare origini di log personalizzate.

Gli eventi dei log del sistema di monitoraggio dell'integrità, insieme alle origini di log usate, sono definiti in Web.config. Con alcune righe di markup di configurazione è possibile usare il monitoraggio dell'integrità per registrare tutte le eccezioni non gestite in un database e per notificare l'eccezione tramite posta elettronica.

Esplorazione della configurazione del sistema di monitoraggio dell'integrità

Il comportamento del sistema di monitoraggio dell'integrità è definito dalle informazioni di configurazione, che si trovano nell'elemento<healthMonitoring> in Web.config. Questa sezione di configurazione definisce, tra le altre cose, le tre informazioni importanti seguenti:

  1. Gli eventi di monitoraggio dell'integrità che, quando generati, devono essere registrati,
  2. Origini di log e
  3. Il mapping di ogni evento di monitoraggio dell'integrità definito in (1) alle origini di log definite in (2).

Queste informazioni vengono specificate tramite tre elementi di configurazione figlio: <eventMappings>, <providers>e <rules>, rispettivamente.

Le informazioni di configurazione del sistema di monitoraggio dell'integrità Web.config predefinite sono disponibili nel file nella %WINDIR%\Microsoft.NET\Framework\version\CONFIG cartella. Queste informazioni di configurazione predefinite, con un markup rimosso per brevità, sono riportate di seguito:

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

Gli eventi di monitoraggio dell'integrità di interesse sono definiti nell'elemento, che assegna un nome descrittivo a una classe di eventi di monitoraggio dell'integrità <eventMappings> . Nel markup precedente l'elemento <eventMappings> assegna il nome descrittivo "Tutti gli errori" agli eventi di monitoraggio dell'integrità di tipo e il nome "Audit errori" agli eventi di monitoraggio dell'integrità di tipo WebBaseErrorEventWebFailureAuditEvent.

L'elemento <providers> definisce le origini di log, assegnandole un nome descrittivo e specificando eventuali informazioni di configurazione specifiche dell'origine log. Il primo <add> elemento definisce il provider "EventLogProvider", che registra gli eventi di monitoraggio dell'integrità specificati usando la EventLogWebEventProvider classe . La EventLogWebEventProvider classe registra l'evento nel registro eventi di Windows. Il secondo <add> elemento definisce il provider "SqlWebEventProvider", che registra gli eventi in un database di microsoft SQL Server tramite la SqlWebEventProvider classe . La configurazione "SqlWebEventProvider" specifica la stringa di connessione del database (connectionStringName) tra le altre opzioni di configurazione.

L'elemento <rules> esegue il mapping degli eventi specificati nell'elemento per registrare le origini nell'elemento <eventMappings><providers> . Per impostazione predefinita, ASP.NET le applicazioni Web registrano tutte le eccezioni non gestite e gli errori di controllo nel registro eventi di Windows.

Registrazione di eventi in un database

La configurazione predefinita del sistema di monitoraggio dell'integrità può essere personalizzata in base a un'applicazione Web per applicazione Web aggiungendo una <healthMonitoring> sezione al file dell'applicazione Web.config . È possibile includere elementi aggiuntivi nelle <eventMappings>sezioni , <providers>e <rules> usando l'elemento <add> . Per rimuovere un'impostazione dalla configurazione predefinita, usare l'elemento <remove> o usare <clear /> per rimuovere tutti i valori predefiniti da una di queste sezioni. Verrà configurata l'applicazione Web Book Reviews per registrare tutte le eccezioni non gestite in un database di Microsoft SQL Server usando la SqlWebEventProvider classe .

La SqlWebEventProvider classe fa parte del sistema di monitoraggio dell'integrità e registra un evento di monitoraggio dell'integrità in un database di SQL Server specificato. La SqlWebEventProvider classe prevede che il database specificato includa una stored procedure denominata aspnet_WebEvent_LogEvent. Questa stored procedure viene passata ai dettagli dell'evento e viene eseguita l'attività di archiviazione dei dettagli dell'evento. La buona notizia è che non è necessario creare questa stored procedure né la tabella per archiviare i dettagli dell'evento. È possibile aggiungere questi oggetti al database usando lo aspnet_regsql.exe strumento .

Nota

Lo aspnet_regsql.exe strumento è stato descritto di nuovo nell'esercitazione Configurazione di un sito Web che usa Servizi applicazioni quando è stato aggiunto il supporto per ASP. Servizi applicazioni di NET. Di conseguenza, il database del sito Web Book Reviews contiene già la aspnet_WebEvent_LogEvent stored procedure, che archivia le informazioni sull'evento in una tabella denominata aspnet_WebEvent_Events.

Dopo aver aggiunto la stored procedure e la tabella necessarie al database, tutto ciò che rimane consiste nell'indicare al monitoraggio dell'integrità di registrare tutte le eccezioni non gestite nel database. A questo scopo, aggiungere il markup seguente al file del Web.config sito Web:

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

Il markup di configurazione del monitoraggio dell'integrità precedente usa <clear /> elementi per cancellare le informazioni di configurazione di monitoraggio dell'integrità predefinite dalle <eventMappings>sezioni , <providers>e <rules> . Aggiunge quindi una singola voce a ognuna di queste sezioni.

  • L'elemento <eventMappings> definisce un singolo evento di monitoraggio dell'integrità di interesse denominato "Tutti gli errori", generato ogni volta che si verifica un'eccezione non gestita.
  • L'elemento <providers> definisce un'unica origine log denominata "SqlWebEventProvider" che usa la SqlWebEventProvider classe . L'attributo connectionStringName è stato impostato su "ReviewsConnectionString", ovvero il nome della stringa di connessione definita nella <connectionStrings> sezione.
  • Infine, l'elemento <regole> indica che quando un evento "Tutti gli errori" restituisce che deve essere registrato usando il provider "SqlWebEventProvider".

Queste informazioni di configurazione indicano al sistema di monitoraggio dell'integrità di registrare tutte le eccezioni non gestite nel database Recensioni libro.

Nota

L'evento WebBaseErrorEvent viene generato solo per gli errori del server. Non viene generato per gli errori HTTP, ad esempio una richiesta per una risorsa ASP.NET non trovata. Ciò è diverso dal comportamento dell'evento HttpApplication della Error classe, generato sia per gli errori server che HTTP.

Per visualizzare il sistema di monitoraggio dell'integrità in azione, visitare il sito Web e generare un errore di runtime visitando Genre.aspx?ID=foo. Verrà visualizzata la pagina di errore appropriata, ovvero l'eccezione Dettagli giallo schermata di morte (quando si visita in locale) o la pagina di errore personalizzata (quando si visita il sito in produzione). Dietro le quinte, il sistema di monitoraggio dell'integrità ha registrato le informazioni sull'errore nel database. Nella tabella deve essere presente un record (vedere la figura 1). Questo record contiene informazioni sull'errore aspnet_WebEvent_Events di runtime appena verificatosi.

Screenshot che mostra i dettagli dell'errore registrati nella tabella.

Figura 1: i dettagli degli errori sono stati registrati nella aspnet_WebEvent_Events tabella
(Fare clic per visualizzare l'immagine full-size)

Visualizzazione del log degli errori in una pagina Web

Con la configurazione corrente del sito Web, il sistema di monitoraggio dell'integrità registra tutte le eccezioni non gestite al database. Tuttavia, il monitoraggio dell'integrità non fornisce alcun meccanismo per visualizzare il log degli errori tramite una pagina Web. È tuttavia possibile creare una pagina di ASP.NET che visualizza queste informazioni dal database. (Come vedremo in modo momentaneo, è possibile scegliere di avere i dettagli dell'errore inviati all'utente in un messaggio di posta elettronica).

Se si crea una pagina di questo tipo, assicurarsi di eseguire i passaggi per consentire solo agli utenti autorizzati di visualizzare i dettagli dell'errore. Se il sito usa già gli account utente, è possibile usare le regole di autorizzazione url per limitare l'accesso alla pagina a determinati utenti o ruoli. Per altre informazioni su come concedere o limitare l'accesso alle pagine Web in base all'utente connesso, vedere esercitazioni sulla sicurezza del sito Web.

Nota

L'esercitazione successiva illustra un sistema alternativo di registrazione degli errori e notifica denominato ELMAH. ELMAH include un meccanismo predefinito per visualizzare il log degli errori da una pagina Web e come feed RSS.

Registrazione di eventi in Email

Il sistema di monitoraggio dell'integrità include un provider di origine log che "registra" un evento a un messaggio di posta elettronica. L'origine log include le stesse informazioni registrate nel database nel corpo del messaggio di posta elettronica. È possibile usare questa origine log per inviare una notifica a uno sviluppatore quando si verifica un determinato evento di monitoraggio dell'integrità.

Aggiorniamo la configurazione del sito Web Book Reviews in modo da ricevere un messaggio di posta elettronica ogni volta che si verifica un'eccezione. Per eseguire questa operazione, è necessario eseguire tre attività:

  1. Configurare l'applicazione Web ASP.NET per inviare posta elettronica. Questa operazione viene eseguita specificando il modo in cui i messaggi di posta elettronica vengono inviati tramite l'elemento <system.net> di configurazione. Per altre informazioni sull'invio di messaggi di posta elettronica in un'applicazione ASP.NET, vedere Invio di Email in ASP.NET e domande frequenti su System.Net.Mail.
  2. Registrare il provider di origine del log di posta elettronica nell'elemento <providers> e
  3. Aggiungere una voce all'elemento che esegue il mapping dell'evento <rules> "Tutti gli errori" al provider di origine del log aggiunto nel passaggio (2).

Il sistema di monitoraggio dell'integrità include due classi del provider di origine del log di posta elettronica: SimpleMailWebEventProvider e TemplatedMailWebEventProvider. La SimpleMailWebEventProvider classe invia un messaggio di posta elettronica di testo normale che include i dettagli dell'evento e fornisce una piccola personalizzazione del corpo del messaggio di posta elettronica. Con la TemplatedMailWebEventProvider classe specificata una pagina ASP.NET il cui markup sottoposto a rendering viene usato come corpo del messaggio di posta elettronica. La TemplatedMailWebEventProvider classe offre un maggiore controllo sul contenuto e sul formato del messaggio di posta elettronica, ma richiede un po'più lavoro iniziale perché è necessario creare la pagina di ASP.NET che genera il corpo del messaggio di posta elettronica. Questa esercitazione è incentrata sull'uso della SimpleMailWebEventProvider classe.

Aggiornare l'elemento del sistema di <providers> monitoraggio dell'integrità nel Web.config file in modo da includere un'origine log per la SimpleMailWebEventProvider classe :

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

Il markup precedente usa la SimpleMailWebEventProvider classe come provider di origine log e la assegna il nome descrittivo "EmailWebEventProvider". Inoltre, l'attributo <add> include opzioni di configurazione aggiuntive, ad esempio gli indirizzi A e Da del messaggio di posta elettronica.

Con l'origine del log di posta elettronica definita, tutto ciò che rimane consiste nell'indicare al sistema di monitoraggio dell'integrità di usare questa origine per "registrare" le eccezioni non gestite. A tale scopo, aggiungere una nuova regola nella <rules> sezione :

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

La <rules> sezione include ora due regole. Il primo, denominato "Tutti gli errori a Email", invia tutte le eccezioni non gestite all'origine log "EmailWebEventProvider". Questa regola ha l'effetto di inviare dettagli sugli errori nel sito Web all'indirizzo A specificato. La regola "Tutti gli errori nel database" registra i dettagli dell'errore nel database del sito. Di conseguenza, ogni volta che si verifica un'eccezione non gestita nel sito, i relativi dettagli vengono registrati nel database e inviati all'indirizzo di posta elettronica specificato.

La figura 2 mostra il messaggio di posta elettronica generato dalla SimpleMailWebEventProvider classe quando si visita Genre.aspx?ID=foo.

Screenshot che mostra i dettagli dell'errore inviati nel messaggio di posta elettronica.

Figura 2: I dettagli dell'errore vengono inviati in un messaggio di Email
(Fare clic per visualizzare l'immagine a dimensione intera)

Riepilogo

Il ASP.NET sistema di monitoraggio dell'integrità è progettato per consentire agli amministratori di monitorare l'integrità di un'applicazione Web distribuita. Gli eventi di monitoraggio dell'integrità vengono generati quando si verificano determinate azioni, ad esempio quando l'applicazione si arresta, quando un utente accede correttamente al sito o quando si verifica un'eccezione non gestita. Questi eventi possono essere registrati in un numero qualsiasi di origini di log. Questa esercitazione ha illustrato come registrare i dettagli delle eccezioni non gestite in un database e tramite un messaggio di posta elettronica.

Questa esercitazione è stata incentrata sull'uso del monitoraggio dell'integrità per registrare le eccezioni non gestite, ma tenere presente che il monitoraggio dell'integrità è progettato per misurare l'integrità complessiva di un'applicazione distribuita ASP.NET e include un'ampia gamma di eventi di monitoraggio dell'integrità e origini di log non esaminate qui. Inoltre, è possibile creare eventi di monitoraggio dell'integrità e origini di log personalizzati, se necessario. Se si è interessati a saperne di più sul monitoraggio dell'integrità, un buon primo passaggio consiste nel leggere le domande frequenti sul monitoraggio dell'integrità di Erik Reitan. A questo scopo, vedere Procedura: Usare il monitoraggio dell'integrità in ASP.NET 2.0.

Buon programmatori!

Altre informazioni

Per altre informazioni sugli argomenti descritti in questa esercitazione, vedere le risorse seguenti: