Saturday, July 11, 2009

Enhanced Event Viewer in VS 2008

Windows provides a nice tool for viewing event logs of our machine. This tool called as Event Viewer is having lot of features to browse through our event logs. Even though, it is a very useful tool to browse our event log, but it does not provide certain features like searching and auto-show up of new events etc. So, I thought of doing an application that makes our event log browsing faster and much easier. First, I will explain the features provided by it followed by design and coding,

Features provided by this Viewer:

Ø Easy to navigate among the Logs.

Ø Easy to filter events.

Ø Easy to do Search.

Ø Click away to access it.

Ø Connect to remote machine’s Event Log.

Ø Listener to show new event entry automatically.

Ø Better User Experience and lot more.

I designed this application in VS 2008 SP1.

Create a new Windows application in C# and name it as EnhancedEventViewer. Add the controls to EventViewer form as shown below:

Purpose of above controls:

v ListView (lvEvents) Ã To list event details like message, event type etc.

v TreeView (tvEventNodes) Ã To list all event logs on our machine.

v MainMenu à To allow user to connect to a remote machine, refresh and clean event logs.

v NotifyIcon à To show/hide the Event Viewer.

v txtSearchText à To filter events based on search criteria.

v ImageList à To display icon based on event type like warning, error etc.

We are done with the design. Now, let's dig into the functionality part of this application. I will outline the steps performed by it.

1) When we run the application, it loads all event logs of our machine.

2) Based on selected Event log, it will list all the events of it.

3) We can do a search by using Search textbox. It will filter events based on its Message property.

4) We can connect to a remote machine, by entering machine name or IP address and pressing Enter. We need permissions on the remote machine to get connected.

Let's go into the coding part. I will outline the important methods.

v LoadEventLogs à This method loads all event logs of a machine.

v LoadEventDetails à This method loads all events of an event log. This will internally calls LoadThreadEventDetails to load events on a separate thread.

v log_EntryWritten à This event will be raised on arrival of a new event in particular event log.

I will explain the core method (LoadThreadEventDetails) for loading events. In order to make application respond to user interactions while loading, I had implemented it on a separate thread using ThreadStart and Thread classes.

private void LoadThreadEventDetails(string logName)

{

lock (logs)

{

try

{

EventItems.Clear();

foreach (EventLog log in logs)

{

if (log.LogDisplayName == logName)

{

foreach (EventLogEntry entry in log.Entries)

{

ListViewItem item = new ListViewItem();

item.Text = entry.EntryType.ToString();

if (item.Text.StartsWith("Inform"))

{

item.StateImageIndex = 0;

}

else if (item.Text.StartsWith("Error"))

{

item.StateImageIndex = 1;

}

else if (item.Text.StartsWith("Warn"))

{

item.StateImageIndex = 2;

}

else

{

item.StateImageIndex = 1;

}

item.SubItems.Add(entry.Message.ToString() == "" ? "None" : entry.Message.ToString());

item.SubItems.Add(entry.TimeWritten.ToShortDateString());

item.SubItems.Add(entry.TimeWritten.ToLongTimeString());

item.SubItems.Add(entry.Source);

item.SubItems.Add(entry.InstanceId.ToString());

item.SubItems.Add(entry.UserName == null ? "N\\A" : entry.UserName);

item.SubItems.Add(entry.MachineName);

item.ToolTipText = entry.Message;

m_AddEventEntry = new AddEventEntry(this.AddEntry);

EventItems.Add(item);

this.Invoke(m_AddEventEntry, (new object[] { item }));

}

m_AddEventEntry = new AddEventEntry(this.AddEntry);

ListViewItem tempItem = new ListViewItem();

tempItem.Text = "!!!!";

this.Invoke(m_AddEventEntry, (new object[] { tempItem }));

break;

}

}

}

catch { }

}

}


See full detail: http://www.c-sharpcorner.com/UploadFile/satisharveti/EventViewer03042009023533AM/EventViewer.aspx

No comments: