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.