Creazione di un file di log per gli errori in ASP.NET

di Nicola Baldi, in ASP.NET,
  • 0
  • 0
  • 0
  • 2,09 KB

Gli errori in ASP.NET possono essere gestiti in modo efficiente grazie agli strumenti che il .NET Framework mette a disposizione.
Dal momento che il runtime del Framework solleva eccezioni quando si verificano errori, gli sviluppatori hanno la possibilità di intercettarle e di gestirle come meglio credono, mediante l'utilizzo di blocchi Try... Catch. In gran parte dei casi, risulta comunque difficile prevedere tutte le eccezioni che una applicazione può sollevare ed è quindi auspicabile l'utilizzo di altri strumenti al fine di evitare comportamenti impredicibili. Per esempio, l'evento Error di HttpApplication ci consente di centralizzare la gestione delle eccezioni in un'unica routine (event handler). Nello script #376 viene mostrato come sfruttare l'evento citato per inviare un'e-mail di avviso contenente i dettagli relativi all'errore.
In taluni casi può invece risultare necessario tenere traccia di tutte le eccezioni che vengono sollevate dall'applicazione, al fine di facilitarne il debug ed individuare eventuali anomalie non previste. In questo articolo ci proponiamo di creare una classe che svolga questo compito, ovvero quello di creare un file di log per la registrazione degli errori.

Dettagli implementativi

La classe proposta in questo articolo memorizza le eccezioni all'interno di un file XML, corredate da alcuni dettagli relativi alle eccezioni stesse e al contesto dell'applicazione.
La scelta del formato è ricaduta su XML per ragioni legate prevalentemente alla portabilità, ma nulla vieta l'utilizzo di un database.
Per ciò che concerne le classi utilizzate, in questo articolo faremo riferimento principalmente allo spazio dei nomi System.Xml, che include le classi utili all'elaborazione dei file in formato XML.

Struttura del file XML

Il file di log ha la struttura riportata di seguito.

<?xml version="1.0" encoding="utf-8" ?>
<ExceptionCollection>
    <Exception>
        <Message>Il processo non può accedere al file "C:\Inetpub\wwwroot\MyApplication\Files\5t53fgjtkt33.dat" perché è in uso da un altro processo.</Message>
        <Source>mscorlib</Source>
        <StackTrace>at System.IO.__Error.WinIOError(Int32 errorCode, String str) at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync, String msgPath, Boolean bFromProxy) at System.IO.FileStream..ctor(String path, FileMode mode) at MyApplication.MyClass.MyMethod(String FilePath) in C:\Inetpub\wwwroot\MyApplication\MyClass.vb:line 84 at ?</StackTrace>
        <DateTime>06/10/2005 00.51</DateTime>
        <Referer>http://localhost/MyApplication/MyWebForm.aspx</Referer>
        <Form>__EVENTTARGET=&__EVENTARGUMENT=&__VIEWSTATE= dDwxMjI0NDk1NjkzO3Q8cDxsPHNvcnRDcml0ZXJpYTtzb3J0RGlyOz47bDxQcmljZVN jb250YXRvO0RFU0M7Pj47bDxpPDE%2bOz47bDx0PDtsPGk8Mz47aTw1PjtpPDk%...</Form>
        <QueryString>FileID=4</QueryString>
    </Exception>
</ExceptionCollection>

Vediamo di descrivere brevemente ogni singolo elemento del file di log.

<Message>: il messaggio di errore.
<Source>: l'applicazione o l'oggetto che ha causato l'errore.
<StackTrace>: ogni chiamata dalla richiesta della pagina originale fino alla riga che ha generato l'errore.
<DateTime>: la data e l'ora nella quale è stato generato l'errore.
<Referer>: l'URI di provenienza.
<Form>: la collection Form.
<QueryString>: la collection QueryString.

La classe ErrorLogger

Il codice della classe ErrorLogger, oggetto dell'articolo, è estremamente semplice (il codice è riportato in toto nell'allegato). All'interno del costruttore viene innanzitutto verificata l'esistenza del file XML contenente i dettagli relativi alle eccezioni sollevate dall'applicazione. Se tale file è inesistente, viene creato attraverso il metodo CreateXMLFile.

Public Sub New(ByVal ffn As String)
    FullFileName = ffn
    ' Verifica dell'esistenza del file.
    If Not System.IO.File.Exists(FullFileName) Then
        ' Se non esiste, chiamo la routine che lo crea.
        CreateXMLFile()
    End If
End Sub

Private Sub CreateXMLFile()
    Dim doc As New XmlDocument
    Dim dec As XmlDeclaration = doc.CreateXmlDeclaration("1.0", "utf-8", Nothing)
    ' Definisco un elemento radice che conterrà tutte le eccezioni.
    Dim root As XmlElement = doc.CreateElement("ExceptionCollection")
    doc.InsertBefore(dec, doc.DocumentElement)
    doc.AppendChild(root)
    ' Salvo il file.
    doc.Save(FullFileName)
End Sub

Il campo privato FullFileName riporta nell'ambito dell'istanza della classe il nome completo del file XML.

2 pagine in totale: 1 2

Attenzione: Questo articolo contiene un allegato.

Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti