in

DotNetMarche

.NET Framework User Group delle Marche

Articoli

Personalizzare i log di ELMAH

 

Di: Ricci Gian Maria

ELMAH è un prodotto open source e completamente freeware per gestire il log automatico degli errori nelle proprie applicazioni ASP.Net. Grazie a questo tool è possibile individuare e correggere tempestivamente gli errori delle proprie applicazioni web una volta in produzione.

 

ELMAH

Il modulo di gestione delle eccezioni ELMAH ha il grande vantaggio di essere sia un buon prodotto, sia di essere open source e quindi liberamente utilizzabile ed estendibile per le proprie necessità. Essenzialmente è un modulo di log degli errori composto da un HttpModule che intercetta ogni errore non gestito e crea un log pieno di informazioni il quale viene poi passato ad uno o più oggetti dispatcher che spostano le informazioni nelle destinazioni scelte. Attualmente ci sono due implementazioni: una salva su un normale database SqlServer, l’altra invia l’errore per posta per avere la massima rapidità di risposta.

Questo tool è particolarmente utile perché nel caso di web application quando si genera un errore non è possibile contattare il navigatore che lo ha generato per chiedergli informazioni ed è necessario quindi sia tracciare l’errore, sia effettuare il log di quante più informazioni possiamo per poter diagnosticare il problema.

Il setup di questo tool è minimale, basta refenziare la dll ed aggiungere alcune opzioni nel web.config, nel progetto di esempio è tra l’altro accluso un web.config dimostrativo che mostra le voci da inserire. La cosa che attira di più è che è comunque possibile aggiungere informazioni a quelle standard, opzione utilissima se si necessita di memorizzare informazioni critiche pertinenti solo al proprio applicativo web.

Per aiutare nelle operazioni di personalizzazione qui di seguito verrà fatta una breve panoramica su come aggiungere alle informazioni standard anche un dump completo delle variabili di sessione. L’esempio non contiene codice perché preferisco che scarichiate il prodotto sul sito originale per correttezza verso l’autore. Le modifiche verranno presentate indicando in che punti della libreria agire e sono di così facile comprensione che la mancanza del codice di esempio non influisce sulla comprensione.

Aggiungere informazioni sulla sessione

Uno dei maggiori pregi di elmah è che è molto facile aggiungere informazioni a quelle di base che vengono memorizzate per ogni eccezione intercettata. Nel database infatti esiste un campo xml dove il modulo va a inserire tutti i dati dell’errore, in questo modo la struttura del database non deve essere modificata se vogliamo aggiungere informazioni addizionali che vanno invece inserite nel campo XML dell’errore stesso. In questo piccolo articolo si mostrerà dove agire per aggiungere alle informazioni anche un dump completo delle variabili di sessione, opzione che non è stata inserita tra le funzionalità base di Elmah e che io ritengo invece molto importante.

Ogni informazione aggiuntiva per un log deve essere mantenuta dentro un oggetto di tipo NameValueCollection e tutte le modifiche al codice da fare riguardano solamente il file Error.cs, rendendo la customizzazione un operazione veramente banale. La prima cosa da fare è aggiungere una variabile di tipo NameValueCollection per ogni gruppo di informazioni aggiuntive che si desidera memorizzare. Il posto più corretto dove impostare questi dati è in calce alla dichiarazione dei gruppi già presenti.

Una volta che il contenitore è stato creato basta inserire i dati richiesti nel costruttore della classe Error, per correttezza sempre nello stesso punto dove la libreria imposta le informazioni base.

Naturalmente la funzione CopyCollection non accetta una sessione come argomento, per questa ragione è necessario scrivere una propria implementazione che inserisca tutte le informazioni necessarie, nel nostro caso il timeout della sessione, il suo Id e di seguito tutte le variabili.

A questo punto è necessario intervenire anche su altre funzioni affinché elmah sia in grado di serializzare da e nell’xml il contenuto delle informazioni aggiuntive, il primo passo è aggiungere alla WriteInnerXml() la serializzazione delle informazioni appena aggiunte

Per quanto riguarda la deserializzazione è necessario invece modificare la routine ReadInnerXml() al cui interno si trova un’istruzione switch che in base al nome del nodo ripristina l’oggetto NameValueCollection corretto.

Tutto il contenuto della collection session è ora presente nel log e viene salvato correttamente nel database.

A questo punto è naturalmente necessario modificare anche il codice che genera la pagina di visualizzazione in modo che mostri anche le nuove informazioni memorizzate. In questo caso il file da modificare è ErrorDetailPage.cs e precisamente deve essere editato alla fine della funzione RenderError() che nella versione base di ELMAH mostra solamente le informazioni aggiuntive delle variabili di applicazione. Se si vuole mostrare ogni info aggiuntiva basta aggiungere il seguente codice

Come si può vedere la funzione RenderCollection() si occupa della generazione dell’html e quindi è particolarmente facile visualizzare le informazioni aggiuntive.

Con poche righe di codice è possibile quindi estendere la struttura base di ELMAH in modo da tracciare informazioni personalizzate che possono aiutare ad individuare più rapidamente la causa dell’errore.

 

 

 

Published Jan 16 2007, 05:42 PM by Alkampfer
Filed under:

Comments

No Comments

About Alkampfer

Chi sono

Mi chiamo Gian Maria Ricci, sono nato il 18/08/1974 e il fatto che mi troviate qui in dotnetmarche significa che per passione e per lavoro mi occupo di .NET.

Sono laureato in Ingegneria Elettronica con specializzazione in Microelettronica, ma la mia passione è sempre stata la programmazione, che coltivo da quando mi fu regalato il mitico Vic20 un paio di decadi fa. Passato per il Basic, alle superiori ho programmato in Pascal e Prolog con qualche deviazione in Fortran e Cobol, fino ad approdare al C/C++. Per lavoro ho poi conosciuto il VB6 ed ho iniziato ad apprezzare il .NET fin dalle beta, tanto da utilizzare .NET come ambiente di sviluppo per la mia tesi.

Oltre che di dotnetmarche faccio parte del gruppo nablasoft, formato da miei ex colleghi di università con cui ho condiviso e condivido ancora la passione per la computer graphics. Tra i lavori prodotti per nablasoft, sicuramente quello di cui vado più orgoglioso è un tutorial in lingua inglese sulla programmazione della Playstation2 tramite il linux kit che ancora oggi ci da una visibilità al primo posto in alcune ricerche di google. Nel sito trovate inoltre altri lavori miei e dei miei colleghi che spaziano dalla matematica, all’elettronica e naturalmente anche al .NET.

Tra le mie altre partecipazioni a gruppi web posso citare GPI (game programming italia) per il quale ricopro il ruolo di responsabile della sezione playstation2, anche se la mia attività è sicuramente stata molto breve ed è molto che non contribuisco più in maniera attiva.

Le mie pubblicazioni

Nel corso degli anni oltre a pubblicare materiale nel sito nablasoft, ho collaborato con altre realtà come www.programmazione.it, il gruppo playstation2linux ed il gruppo infomedia di cui sono articolista principalmente per la rivista dev.

  • "Funzionali ed adattatori nella STL"- Computer Programming (aprile 2004).
  • "Esportare il contenuto di una DataGrid in Microsoft Excel" –Computer Programming (maggio 2004)
  • "Garbage Collection in ambiente .NET" – Computer Programming (luglio 2004)
  • "Serializzazione e persistenza in database" –DEV (Luglio 2004)
  • "Programmare la PS2 tramite il Linux kit. Introduzione" - DEV (settembre 2004)
  • "Utilizzare la libreria zlib in C# o VB.NET" - DEV (agosto 2004)
  • "Programmare la PS2 tramite il Linux kit. Renderizzare un cubo" – DEV (ottobre 2004)
  • "Utilizzo di puntatori per elaborare immagini in C#" - DEV (novembre 2004)
  • "Programmare la PS2 tramite il Linux kit. Utilizzare il joypad" - DEV (novembre 2004)
  • "Personalizzare l'aspetto dei menu con GDI+" - DEV (dicembre 2004)
  • "Utilizzare MSDE in applicazioni desktop. Installazione e gestione" – DEV (dicembre 2004)
  • "Utilizzare MSDE in applicazioni desktop. Deployment" – DEV (gennaio 2005)
  • "PC o console, tecniche di sviluppo a confronto" – DEV (gennaio 2004)
  • "CLR Profiler per .NET - Stringhe e finalizzazione" – Computer Programming (gennaio 2005)
  • "Utilizzare MSDE in applicazioni desktop. Distribuire la struttura di database" – DEV (febbraio 2005)
  • "Comunicare in rete tramite C#" – DEV (febbraio 2004)
  • "CLR Profiler per .NET – Pool di oggetti" – Computer Programming (febbraio 2005)
  • "Amministrare le politiche in Active Directory" – Login (marzo/aprile 2005)
  • "Spedire mail in C#" – DEV (aprile 2005)
  • "Utilizzare API di shell in C#" – DEV (maggio 2005)
  • ".NET e remoting" – DEV (Maggio 2005)
  • "Utilizzare Dll C++ in Visual Basic 6" – DEV (Maggio 2005)
  • "Sql Server 2005 - Scrivere un aggregatore custom in Visual Basic" – DEV (Giugno 2005)
  • "Utilizzare le API di shell in C# - 2a parte" – DEV (Giugno 2005)
  • "Utilizzare le API di shell in C# - 3a parte" – DEV (Settembre 2005)
  • "Trasferire una sessione da ASP ad ASP.NET " – DEV (Settembre 2005)
  • "Unit testing in .NET 2.0" – DEV (Ottobre 2005)
  • "Visual Studio 2005 Class diagram" – DEV (Ottobre 2005)
  • "Nullable Types in .NET 2.0", DEV (Novembre 2005)
  • "Creare Una trial in C#", DEV (Dicembre 2005)
  • "Linguaggi ed evoluzione di sintassi", DEV (Gennaio 2006)
  • "C# 2.0 Evoluzioni sintattiche”, DEV (Gennaio 2006)
  • "Office Web Components - Realizzare un report in Excel", DEV (Gennaio 2006)
  • "VB.NET e Sql Server 2005 - Scrivere stored procedures in VB.NET", DEV (Febbraio 2006)
  • "Persistence Frameworks in C#”, DEV (Maggio 2006)
  • "Persistenza con serializzazione XML in .NET 2.0", DEV (Maggio 2006)
  • ".NET 2.0 – Enterprise Library 2.0, logging", DEV (Maggio 2006)
  • "Database - XML e SQL Server 2005", DEV(Giugno 2006)
  • "Enterprise Library 2.0 Logging - Seconda parte", DEV (Giugno 2006)
  • "ASP.NET 2.0 e AJAX", DE (Luglio 2006)

  • PS2 3D programming Tutorial - Tutorial sulla programmazione 3D per la console Playstation 2 Pubblicato nel sito ufficiale Sony per il kit PS2 linux.

<script src="http://feeds.feedburner.com/AlkampferEng?format=sigpro" type="text/javascript" ></script><noscript>

Subscribe to RSS headline updates from:
Powered by FeedBurner

</noscript>
Powered by Community Server (Commercial Edition), by Telligent Systems