I wanted to check how to use the fluent configuration API for the Logging Application Block in Enterprise Library 5.
So I thought to myself, why not implement it with an HTTP module and provide two examples in one post.
Using the Fluent Configuration API with Logging Application Block
I wrote an article about the fluent configuration in Enterprise Library 5 in the past. Here is how I configured the Enterprise Library container in order to use the Logging Application Block in a simple flat file scenario:
private void ConfigureEnterpriseLibraryContainer()
{
var builder = new ConfigurationSourceBuilder();
builder.ConfigureInstrumentation().EnableLogging();
builder.ConfigureLogging().WithOptions
.LogToCategoryNamed("General")
.WithOptions
.SetAsDefaultCategory()
.SendTo
.FlatFile("Log File")
.FormatWith(new FormatterBuilder()
.TextFormatterNamed("Textformatter"))
.ToFile("file.log");
var configSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace(configSource);
EnterpriseLibraryContainer.Current =
EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
}
Pay attention that in order to use this API, you need to add references to the following DLLs:
Microsoft.Practices.EnterpriseLibrary.Common
Microsoft.Practices.EnterpriseLibrary.Logging
Microsoft.Practices.ServiceLocation
System.Configuration
Now that we have the configuration placed in memory, we can use it in our code.
Building the HTTP Module
In order to build an HTTP module, we only need to implement the IHttpModule
interface. The following is a simple LoggingHttpModule
which logs details when a web request starts and when a web request ends:
using System;
using System.Web;
using Microsoft.Practices.EnterpriseLibrary.Common.Configuration;
using Microsoft.Practices.EnterpriseLibrary.Logging;
namespace HttpModules
{
public class LoggingHttpModule : IHttpModule
{
#region Members
private LogWriter _writer;
#endregion
#region IHttpModule Members
public void Dispose()
{
if (_writer != null)
{
_writer.Dispose();
}
}
public void Init(HttpApplication context)
{
CreateLogWriter();
context.BeginRequest += new EventHandler(context_BeginRequest);
context.EndRequest += new EventHandler(context_EndRequest);
}
private void CreateLogWriter()
{
ConfigureEnterpriseLibraryContainer();
_writer = EnterpriseLibraryContainer.Current.
GetInstance<LogWriter>();
}
private void ConfigureEnterpriseLibraryContainer()
{
var builder = new ConfigurationSourceBuilder();
builder.ConfigureInstrumentation().EnableLogging();
builder.ConfigureLogging().WithOptions
.LogToCategoryNamed("General")
.WithOptions
.SetAsDefaultCategory()
.SendTo
.FlatFile("Log File")
.FormatWith(new FormatterBuilder()
.TextFormatterNamed("Textformatter"))
.ToFile("file.log");
var configSource = new DictionaryConfigurationSource();
builder.UpdateConfigurationWithReplace(configSource);
EnterpriseLibraryContainer.Current =
EnterpriseLibraryContainer.CreateDefaultContainer(configSource);
}
void context_BeginRequest(object sender, EventArgs e)
{
_writer.Write(new LogEntry
{
Message = "BeginRequest"
});
}
void context_EndRequest(object sender, EventArgs e)
{
_writer.Write(new LogEntry
{
Message = "EndRequest"
});
}
#endregion
}
}
Using the Module
In order to use the module, all we need to do is to add a reference to the class library that holds the LoggingHttpModule
. Then we need to register the module in the web.config file in the httpModules
element like:
<httpModules>
<add name="LoggingHttpModlue"
type="HttpModules.LoggingHttpModule, HttpModules"/>
</httpModules>
That is it. Now the module will be executed whenever a request starts or ends.
Summary
Using the fluent configuration API of Enterprise Library 5 can make it easy to configure cross cutting concerns like logging without a configuration file. The API is simple and very easy to apply. In this post, I showed how to combine the Logging Application Block within an HTTP module with the fluent configuration API.