Technically this falls in line closer with the EventLog series I did in January. (For more info see my series on event logging, it started on January 16 of this year and ran to the 19th, http://shrinkster.com/p6d). However, in most cases the Event Log is tied in closely with Windows Services since it’s through the event log that services do most of their communication with the outside world. As such it can be important to read in your events back into your control app.
To read the log we’ll use two different methods, just to show multiple techniques. To start, let’s add a text box to the TLManager, under the buttons. I named mine txtEventLog. Next, in the component area of the toolbox find the EventLog component and drop it on the form. Like the timer, it goes in the tray area under the form. I named mine TimerEventLog.
In the properties for the TimeEventLog, there’s a few properties we must set. First, set the Log property to “ArcaneTimeLogger” and the Source to “ArcaneTimeLoggerService”, so it will know to read our log.
Next set EnableRaisingEvents to true. This will allow the EventLog component to raise an event whenever something gets written to our log. Since we set this to true, we must indicate what method is responsible for the event. Click on the Event button (the lightening bolt) in the properties window to switch to events view, then double click the EventWritten to generate a default named event. It will generate TimeEventLog_EntryWritten.
Now switch to code view, and add this code to the event:
private void TimeEventLog_EntryWritten(object sender, System.Diagnostics.EntryWrittenEventArgs e)
txtEventLog.Text = e.Entry.Message
This will take the latest event log entry, and add it to the text box. Note I put it first, then add back what was already in the text box. This way the most recent event will always be at the top.
That’s it for this part, now everytime something is written to the event log, the EventLog component will catch the event and let us know about it.
Nice, but sometimes you also want to know what’s already there in the log. Instead of using a component let’s see how to do this with code. First, add a “using System.Diagnostics” reference to the header of your class (form).
Now, I think it would look nice when the TLManager loads to already have the text box populated with the past events. The System.Diagnostics library contains an EventLog class we can use to create an object for our particular event log. Once that’s done, we can cycle through the Entries collection to read what’s there. Here’s some code I added to the TLManger_Load event to do just that.
StringBuilder sb = new StringBuilder();
EventLog atl = new EventLog(“ArcaneTimeLogger”);
for (int i = atl.Entries.Count – 1; i > -1; i–)
txtEventLog.Text = sb.ToString();
I start by creating a string builder object to hold all of the events. Next, and the key is the EventLog atl… line. I pass in the name of our log so the atl object will know what log it belongs to.
Next you will see a for loop that cycles through the entries. Note I’m deliberately starting with the last entry, the most recent one, and counting down to the oldest one. This will ensure the most recent event appears first in the text box.
Finally, I copy the data we’ve built into the string builder into the text box. And that’s it, two ways to monitor event logs and pull their data into your application.
5 thoughts on “Windows Services in C#: Pulling in the Event Log for your Windows Service (part 8)”
Using Visual Studio 2008 and .NET Framework 3.5, I never was able to get the custom event log created. All my messages ended up in the Application log.
This was a great series – thanks for putting the effort in.
Found this series through the almighty Google and what a find it was. Like Warrick, I also had troubles creating a custom event log using VS.2005/.Net 2.0 but no matter, I will figure it out.
I had started looking into figuring out named pipes via WCF in .Net 3.0 and maybe that would be a fun tangent to take now from your lesson 6 some time since then there is 2-way comm and one is not limited to passing just integers 😉
Thanks for the great series of tutorials!
Robert, thanks much. EXACTLY what I was looking for and works perfectly both in my Service and Controller app. Never would have figured out the funky EventLog VS toolbox control without your guidance.
Windows Event Helper C# “Integration with EventLog”::
Excelletn lessons about services. Thanks!
But I wander how can I configure the service? Is it possible to have some configuration file? Or pass parameters?