Click here to Skip to main content
15,867,330 members
Articles / Web Development / ASP.NET
Article

Simple XML based Error Log

Rate me:
Please Sign up or sign in to vote.
3.40/5 (7 votes)
13 Jul 20042 min read 85K   1.9K   34   11
This article shows how to write and use simple XML-based error log

Sample Image - XMLErrorLog.gif

Introduction

This article explains how to log errors (actually exceptions) which have occured in your app into an XML file. My error log is actually simple class ErrorLog in namespace DNH.Common.Errors. It's part of my library DNH.Common and I use this class in my projects. Although it is very simple, I think that functionality of ErrorLog really helps in debugging applications. It shows how to write XML using XmlTextWriter .

This article provides some basics of:

  • writing XML files using System.Xml.XmlTextWriter
  • handling exceptions using try-catch
  • detecting unhandled exceptions using Server.GetLastError()

Using the code

First at all, you must add reference to assembly dnh.common.errors.dll into your project. Then you must write using DNH.Common.Errors or use full name of class: DNH.Common.Errors.ErrorLog. Then simply declare variable of ErrorLog class type. Calling constructor is simple:

C#
m_log = new ErrorLog(this.Server.MapPath("errorlogs/SampleXMLLog.xml"))
Only argument passed is path to XML file. First time this is called, ErrorLog will create new file. So be sure it has read/write access to that virtual directory.

As I wrote, ErrorLog writes down errors when Exception is thrown. Exception must be catched in try-catch block. Or in ASP.NET web apps, it can be also obtained by calling Server.GetLastError() (probably in Global.asax.cs, Application_Error handler).

This is handler in Global.aspx.cs:

C#
protected void Application_Error(Object sender, EventArgs e)
{
    // log unhandled exception
    m_log.SaveExeptionToLog(Server.GetLastError());
    //
    // it's late, but better do something!
    //
}

Points of Interest

This code writes data from Exception into XML writer:

C#
private void WriteException(Exception e, XmlWriter xmlWriter)
{
    xmlWriter.WriteStartElement(XML_EXCEPTION);
    xmlWriter.WriteElementString(XML_EXCEPTION_TIME,
        System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
    // write the description of exeption
    xmlWriter.WriteElementString(XML_EXCEPTION_DESCRIPTION,
        e.Message);

    // method where exception was thrown
    if(e.TargetSite!=null)
        xmlWriter.WriteElementString(XML_EXCEPTION_METHOD,
            e.TargetSite.ToString());
    // help link
    if(e.HelpLink!=null)
        xmlWriter.WriteElementString(XML_EXCEPTION_HELPLINK,
            e.HelpLink);
    // call stack trace
    xmlWriter.WriteStartElement(XML_EXCEPTION_TRACE);
    xmlWriter.WriteString(e.StackTrace);
    xmlWriter.WriteEndElement();
    if(e.InnerException!=null)
    {
        // recursively writes inner exceptions
        WriteException(e.InnerException,xmlWriter);
    }

This method write data into XML file using method above:

       public void SaveExeptionToLog(System.Exception e)
       {
           string strOriginal = null;

           XmlTextReader xmlReader = new XmlTextReader(m_logFileName);
           xmlReader.WhitespaceHandling = WhitespaceHandling.None;
           //Moves the reader to the root element.
           // skip <?xml version="1.0" ...
           xmlReader.MoveToContent();
           strOriginal = xmlReader.ReadInnerXml();
           xmlReader.Close();
           // write new document
           XmlTextWriter xmlWriter =
new System.Xml.XmlTextWriter(m_logFileName,System.Text.Encoding.UTF8);
           xmlWriter.WriteStartDocument();
           xmlWriter.WriteDocType(
             XML_ERRORLOG_DOCTYPE,null,XML_ERRORLOG_DTD,null);
           xmlWriter.WriteStartElement(XML_ERRORLOG);
           // write original content
           xmlWriter.WriteRaw(strOriginal);
           //write down new exception
           WriteException(e,xmlWriter);
           xmlWriter.WriteEndElement();
           xmlWriter.Close();
       }

Please note that I first load original file and then I add new node. Use of XmlDocument and XmlDocument.AppendChild() is maybe better (more obvious). Anyway, I hope this is readable as well. Also note that I track inner exceptions by recursive calling WriteException() with Exception.InnerException as argument.

TODO

There is of course a lot to do...
  • case when more exceptions occurs in same time should be handled
  • add more informations (like infos about currently logged users in your app)
  • manipulating with XML could be done using XmlDocument or XmlDocumentFragment. It's more clear.
  • generated XML is described by DTD. Expect use of XML Schema in next release.
  • this one is difficult: automatic analysis of occured errors. but it would be great :)

History

  • 14.7.2004 - Article first posted to CodeProject

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Student Charles University in Prague
Czech Republic Czech Republic
My real name is David Nohejl, aka DNH. I am from Prague, Czech Republic. I am interested in many aspects of programming (databases, AI, algorithms...). My favourite programming language is C#, favourite IDE is, of course, VS.NET Smile | :) . I love XML and all the things around it... Other interest than programming are science (math, physics, biology, psychology, paleontology) and basketball. Graduated Faculty of Mathematics and Physics, Charles University in Prague as BSc. Working as programmer in company Unlimited ltd.. Doing cool stuff with C#, WPF, Javascript.

Comments and Discussions

 
Questionneed thread safe version asap Pin
QMasters22-May-07 5:30
professionalQMasters22-May-07 5:30 
AnswerRe: need thread safe version asap Pin
DavidNohejl26-May-07 2:50
DavidNohejl26-May-07 2:50 
GeneralObsolete Pin
OugalNevets10-Dec-06 11:16
OugalNevets10-Dec-06 11:16 
GeneralHai Pin
Vedagni23-Dec-04 1:53
Vedagni23-Dec-04 1:53 
GeneralRe: Hai Pin
DavidNohejl23-Dec-04 3:31
DavidNohejl23-Dec-04 3:31 
GeneralRe: Hai Pin
Vedagni23-Dec-04 19:17
Vedagni23-Dec-04 19:17 
GeneralRe: Hai Pin
Charles Meyer6-Jan-05 20:04
Charles Meyer6-Jan-05 20:04 
GeneralRe: Hai Pin
DavidNohejl8-Jan-05 11:56
DavidNohejl8-Jan-05 11:56 
Questionthread safety? Pin
Eric Engler16-Jul-04 7:40
Eric Engler16-Jul-04 7:40 
AnswerRe: thread safety? Pin
DavidNohejl16-Jul-04 8:04
DavidNohejl16-Jul-04 8:04 
Generallog4net Pin
Uwe Keim14-Jul-04 19:42
sitebuilderUwe Keim14-Jul-04 19:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.