Condividi tramite


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, 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 Error 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 a uno sviluppatore non è necessario, perché 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 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à, è possibile registrarlo in un numero qualsiasi di origini di log specificate. Il sistema di monitoraggio dell'integrità 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, 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. Eventi di monitoraggio dell'integrità che, quando generati, devono essere registrati,
  2. Origini dei log e
  3. Modalità di 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 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à 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 WebBaseErrorEvent e il nome "Controllo errori" agli eventi di monitoraggio dell'integrità 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 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 il stringa di connessione del database (connectionStringName) tra le altre opzioni di configurazione.

L'elemento <rules> esegue il mapping degli eventi specificati nell'elemento <eventMappings> per registrare le origini 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 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 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 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 illustrato di nuovo nell'esercitazione Configurazione di un sito Web che usa i servizi applicazione 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 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 usa <clear /> gli elementi per cancellare le informazioni di configurazione del monitoraggio dell'integrità <eventMappings>predefinite dalle 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", 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 del stringa di connessione definito nella <connectionStrings> sezione.
  • Infine, l'elemento <rules> indica che quando un evento "Tutti gli errori" traspare 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 Delle revisioni libro.

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 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 la schermata gialla dettagli eccezione della morte (quando si visita localmente) 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 aspnet_WebEvent_Events figura 1). Questo record contiene informazioni sull'errore di runtime appena verificatosi.

Screenshot che mostra 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 dell'integrità 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 altre informazioni su come concedere o limitare l'accesso alle pagine Web in base all'utente connesso, vedere le esercitazioni sulla sicurezza dei siti Web personali.

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 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. 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 dell'integrità <providers> 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 lo assegna al 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 dell'errore inviati nel 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, è possibile creare eventi di monitoraggio dell'integrità e origini 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. A questo scopo, vedere Procedura: Usare il monitoraggio dell'integrità in ASP.NET 2.0.

Buon programmatori!

Altre informazioni

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