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: }