Condividi tramite


Registrazione dei dettagli degli errori con il monitoraggio della salute di ASP.NET (VB)

di Scott Mitchell

Il sistema di monitoraggio dell'integrità di Microsoft offre un modo semplice e personalizzabile per registrare vari eventi Web, incluse le 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 possono 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'esercitazione Errorprecedente 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 gestore eventi per registrare i dettagli dell'errore e notificare uno sviluppatore non è necessaria, perché questa attività può essere eseguita dal sistema di monitoraggio dell'integrità di ASP.NET.

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

  • Eventi di durata dell'applicazione, ad esempio all'avvio o all'arresto di un'applicazione
  • Eventi di sicurezza, inclusi tentativi di accesso non riusciti e richieste di autorizzazione URL non riuscite
  • Errori dell'applicazione, incluse eccezioni non gestite, eccezioni di analisi dello stato di visualizzazione, eccezioni di convalida delle richieste ed errori di compilazione, tra gli altri tipi di errori.

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

Gli eventi registrati dal sistema di monitoraggio della salute, insieme alle origini dei log utilizzate, 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 della salute

Il comportamento del sistema di monitoraggio della salute è 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. Eventi di monitoraggio della salute che, al loro verificarsi, devono essere registrati,
  2. Origini dei log e
  3. Come ogni evento di monitoraggio della salute definito in (1) è mappato 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 predefinite del sistema di monitoraggio della salute Web.config sono disponibili nel file nella cartella %WINDIR%\Microsoft.NET\Framework\version\CONFIG. Queste informazioni di configurazione predefinite, con alcuni markup rimossi per brevità, sono illustrate 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à sono quelli di interesse definiti nell'elemento <eventMappings>, che assegna un nome di facile comprensione a una classe di eventi di monitoraggio della salute. Nel markup precedente, l'elemento <eventMappings> assegna il nome descrittivo "Tutti gli errori" agli eventi di monitoraggio dell'integrità di tipo WebBaseErrorEvent e il nome "Revisioni di guasti" agli eventi di monitoraggio di tipo WebFailureAuditEvent.

L'elemento <providers> definisce le origini di log, assegnando loro un nome descrittivo e specificando eventuali informazioni di configurazione specifiche dell'origine del log. Il primo <add> elemento definisce il provider "EventLogProvider", che registra gli eventi di monitoraggio dell'integrità specificati usando la classe EventLogWebEventProvider. 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 il stringa di connessione del database (connectionStringName) tra le altre opzioni di configurazione.

L'elemento <rules> mappa gli eventi specificati nell'elemento <eventMappings> alle sorgenti di log nell'elemento <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 della salute può essere personalizzata per ciascuna 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 per <clear /> rimuovere tutti i valori predefiniti da una di queste sezioni. Configurare 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 riceve i dettagli dell'evento e memorizza i 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 strumento aspnet_regsql.exe è stato discusso in precedenza nell'esercitazione Configurazione di un sito Web che usa i servizi delle applicazioni, quando è stato aggiunto il supporto per i servizi applicazioni di ASP.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 è istruire il monitoraggio dello stato per registrare tutte le eccezioni non gestite nel database. A tale 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 utilizza gli elementi <clear /> per cancellare le informazioni di configurazione del monitoraggio dell'integrità predefinite dalle sezioni <eventMappings>, <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", che viene generato ogni volta che si verifica un'eccezione non gestita.
  • L'elemento <providers> definisce una singola origine di log denominata "SqlWebEventProvider" che usa la SqlWebEventProvider classe . L'attributo connectionStringName è stato impostato su "ReviewsConnectionString", ovvero il nome della stringa di connessione definita nella sezione <connectionStrings>.
  • Infine, l'elemento <rules> indica che, quando si verifica un evento "Tutti gli errori", questo deve essere registrato utilizzando il provider SqlWebEventProvider.

Queste informazioni di configurazione indicano al sistema di monitoraggio dello stato di salute di registrare tutte le eccezioni non gestite nel database delle recensioni di libri.

Nota

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

Per visualizzare il sistema di monitoraggio dello stato di salute in azione, visitare il sito Web e generare un errore in fase di esecuzione visitando Genre.aspx?ID=foo. Verrà visualizzata la pagina di errore appropriata, ovvero la Schermata Gialla di Morte con Dettagli dell'Eccezione (quando si visita localmente) o la pagina di errore personalizzata (quando si visita il sito in produzione). Dietro le quinte, il sistema di monitoraggio della salute ha registrato le informazioni sull'errore nel database. Nella tabella deve essere presente un record (vedere la aspnet_WebEvent_Events figura 1). Questo record contiene informazioni sull'errore di runtime appena verificatosi.

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

Figura 1: I dettagli dell'errore sono stati registrati nella aspnet_WebEvent_Events tabella
(Fare clic per visualizzare l'immagine a dimensione intera)

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 nel database. Tuttavia, il monitoraggio dello stato di salute non fornisce alcun meccanismo per visualizzare il log degli errori tramite una pagina Web. Tuttavia, è possibile compilare una pagina ASP.NET che visualizza queste informazioni dal database. (Come vedremo momentaneamente, è possibile scegliere di inviare i dettagli dell'errore 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à account utente, è possibile usare le regole di autorizzazione URL per limitare l'accesso alla pagina a determinati utenti o ruoli. Per ulteriori informazioni su come concedere o limitare l'accesso alle pagine Web in base all'utente connesso, fai riferimento ai miei Tutorial 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 tramite posta elettronica

Il sistema di monitoraggio della salute include un provider di origine log che "registra" un evento in un messaggio di posta elettronica. La sorgente del registro include le stesse informazioni registrate nel database nel corpo del messaggio di posta elettronica. Puoi usare questa origine log per notificare uno sviluppatore quando si verifica un evento specifico di monitoraggio della salute.

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

  1. Configurare l'applicazione Web ASP.NET per l'invio di messaggi di 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 messaggi di posta elettronica in ASP.NET e System.Net.Mail.
  2. Registrare il provider di origine del log di posta elettronica nell'elemento <providers> e
  3. Aggiungere una voce all'elemento <rules> che esegue il mapping dell'evento "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 si specifica 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 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 monitoraggio della salute <providers> nel file Web.config in modo da includere un'origine di log per la classe SimpleMailWebEventProvider.

<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 classe SimpleMailWebEventProvider come provider di origine del log e le 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 "All Errors To 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 inviati in un messaggio di posta elettronica.

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

Riepilogo

Il sistema di monitoraggio dell'integrità ASP.NET è 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 è 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 ASP.NET distribuita e include un'ampia gamma di eventi di monitoraggio dell'integrità e origini di log non esaminate qui. Inoltre, puoi creare i tuoi eventi di monitoraggio dello stato di salute e fonti di log, 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. Successivamente, consultare Procedura: Utilizzare il monitoraggio della salute in ASP.NET 2.0.

Buon programmatori!

Altre informazioni

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