Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Building a Simple Logging HTTP Module with Logging Application Block

0.00/5 (No votes)
21 Jul 2010 1  
The article deals with an HTTP module for logging using the Logging Application Block and Enterprise Library 5 fluent configuration API.

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.

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