Hendrik Swanepoel

June 2008 - Posts

Asp.Net MVC logging filter
On my current project we are making extensive use of ASP.Net MVC and LINQ, which is a nice change since I've been working on mainly WCF and WF based projects for the last few years.
We immediately identified that it would be worthwhile to create a filter which does logging for us, and this is what I came up with.
   1:  using System.Reflection;
   2:  using System.Text;
   3:  using System.Web.Mvc;
   4:  using Axis.CRD.Logic;
   5:  using log4net;
   6:   
   7:  namespace Hendrik
   8:  {
   9:      public class LoggingFilter : ActionFilterAttribute
  10:      {
  11:          private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  12:   
  13:          public override void OnActionExecuted(FilterExecutedContext filterContext)
  14:          {
  15:              if (filterContext.Exception != null)
  16:                  return;
  17:   
  18:              var logMessage = new StringBuilder();
  19:              logMessage.AppendFormat("Finished call to method {0} on controller {1}",
  20:                                      filterContext.ActionMethod.Name, filterContext.Controller);
  21:              var parameters = filterContext.ActionMethod.GetParameters();
  22:              Append(logMessage, filterContext, parameters);
  23:   
  24:              logger.Debug(logMessage);
  25:          }
  26:   
  27:          public override void OnActionExecuting(FilterExecutingContext filterContext)
  28:          {
  29:              var logMessage = new StringBuilder();
  30:              logMessage.AppendFormat("Starting call to method {0} on controller {1}",
  31:                                      filterContext.ActionMethod.Name, filterContext.Controller);
  32:              var parameters = filterContext.ActionMethod.GetParameters();
  33:              Append(logMessage, filterContext, parameters);
  34:              logger.Debug(logMessage);
  35:          }
  36:   
  37:   
  38:          public static void Append(StringBuilder logMessage, FilterContext filterContext, ParameterInfo[] parameters)
  39:          {
  40:              if (parameters.Length > 0)
  41:              {
  42:                  logMessage.AppendLine().Append("Parameters:");
  43:              }
  44:              foreach (var parameter in filterContext.ActionMethod.GetParameters())
  45:              {
  46:                  var passedValue = (filterContext.RouteData.Values.ContainsKey(parameter.Name)) ?
  47:                      filterContext.RouteData.Values[parameter.Name] : filterContext.HttpContext.Request[parameter.Name];
  48:                  passedValue = passedValue ?? filterContext.HttpContext.Request[parameter.Name];
  49:                  logMessage.AppendLine().AppendFormat("*{0} : {1}", parameter.Name, passedValue);
  50:              }
  51:          }
  52:      }
  53:  }