ASP.NET Health Monitoring – Building an EventLogWebEventProvider – Part 3

On my previous posts on this health monitoring series I explain to you how and why I made my own EventLogWebEventProvider and which benefits you can achieve by using this provider or by making your own.

Now I'll write about how to use this new provider in one application.

Well, almost everything have been written about this topic and Microsoft has one good article on “How To: Use Health Monitoring in ASP.NET 2.0” so I wont even try to explain all the possible scenarios and configurations, I will simply explain the standard scenario.

Typically I simply want to keep track on two Web Event types:

  1. the ones related to application errors
  2. an the others related to application life cycle

As far as I notice there are many people that simply track those from point 1.

Another decision to make is where to store these Web Events data, You do this by choosing a Web Event provider.

ASP.NET give us out-of-the-box several providers and you can make your own provider. Once your provider is done you can use it just like all the others.

In this example I will use the newly created provider.

Now that I know exactly what to track and where to store it I can update my configuration.

All health monitoring configuration data is stored in the system.webhealthMonitoring section and my standard configuration will look like:

<healthMonitoring enabled="true">
    <add name="ExtendedEventLogWebEventProvider" type="NG.Web.Management.EventLogWebEventProvider, NG.Web" source="MyEvtLogSource" />
    <clear />
    <add name="Application Lifetime Events Default" eventName="Application Lifetime Events" provider="ExtendedEventLogWebEventProvider" profile="Default" />
    <add name="All Errors Default" eventName="All Errors" provider="ExtendedEventLogWebEventProvider" profile="Default" />

Notice the source attribute from the ExtendedEventLogWebEventProvider, using it you can set which EventLog source to use.

Remember that when you create a EventLog source you can choose to create a brand new EventLog and if you choose so, all entries written by this provider in this application context will be isolated from all the others providing one easy way for visual tracking and filtering.

With the health monitoring data in place you should now be able to see the entries appearing in EventLog.

ASP.NET Health Monitoring – Building an EventLogWebEventProvider – Part 2

In the first post of this series I've manage to find the correct eventId for each Web Event type, and by this time the major problem has been solved, but I cannot yet write a correct entry into the EventLog.

I still have to decided the best severity type and category to apply.


If you look at entries in the EventLog generated by the default EventLogWebEventProvider you will find that they are marked mainly as Information and a few of them are also marked as Warning but no one is ever marked as Error.

Since I'm making my own provider I will take this chance to map the EventLog entry severity type according to the source Web Event.[more]

Web Event EventLog entry Severity
WebBaseEvent EventLogEntryType.Information
WebManagementEvent EventLogEntryType.Information
WebApplicationLifetimeEvent EventLogEntryType.Information
WebRequestEvent EventLogEntryType.Information
WebHeartbeatEvent EventLogEntryType.Information
WebBaseErrorEvent EventLogEntryType.Warning
WebRequestErrorEvent EventLogEntryType.Error
WebErrorEvent EventLogEntryType.Error
WebAuditEvent EventLogEntryType.Information
WebSuccessAuditEvent EventLogEntryType.SuccessAudit
WebAuthenticationSuccessAuditEvent EventLogEntryType.SuccessAudit
WebFailureAuditEvent EventLogEntryType.FailureAudit
WebAuthenticationFailureAuditEvent EventLogEntryType.FailureAudit
WebViewStateFailureAuditEvent EventLogEntryType.FailureAudit

Naturally, you can decided to map the Web Events exactly has the default EventLogWebEventProvider does.

Finally all I need is to do is set the correct category for the Web Events.


Although all Web Events belong to the same category 'Web Events', the problem is how to make the correct text appear.

The value shown in the category property is a resource string and to select the correct category value is necessary to set the  exact resourcekey.

That is not so hard to do, I could have made my own resource assembly with only one resource, but I have a better way … I will use the same resource assembly that ASP.NET use.

To figure out which assembly to use I simply used regedit.exe to look at "HK_LMSystemCurrentControlSetServicesEventLogApplicationASP.NET 2.0.50727.0"


What I look for are the settings used by the "ASP.NET 2.0.50727.0" EventLog source which is the source used to write the Web Events EventLog entries.

The settings I will use are the CategoryCount and CategoryMessageFile keys because they are the ones that instruct which category assembly to load.

Name Data
CategoryCount 5
CategoryMessageFile C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_rc.dll

Please note that the CategoryMessageFile may change according to operating system and ASP.NET version.

Finally, I need to know the exact resourcekey of the "Web Event" string, and since there simply 5 resources in assembly it took no time to get the following table:

Category Resource Key Category
0 None
1 Setup
2 Uninstall
3 Web Event
4 File Monitoring
5 Admin Service

Now I simply need to configure my EventLog source to use those same settings.

As I said in part 1, you can create an EventLog source using the EventLog.CreateEventSource method, but for setting the CategoryCount and CategoryMessageFile values you must use this specific overload EventLog.CreateEventSource(EventSourceCreationData sourceData).

That's it … I've got everything I need and the final result look like this:


It looks similar to the usual but if you look closer you will find the differences.


What you need to keep in mind is that:

  • the EventId and Category values are keep unchanged;
  • the entry Type respects the Web Event type as opposing to the EventLogWebEventProvider given by ASP.NET that only uses Information and Warning;
  • the EventLog source can be one of my choise (not the usual "ASP.NET") and can change by application;
  • you can choose either to use the existing EventLogs or to create a brand new one for your application(s) .

As a final note remember that with this provider you can now organize your application EventLog entries into specific EventLogs, and you may also filter them by application Source.

Download the code here.