Is there A good strategy to Log the User activity on an ASP MVC App? (ActionFilters/ HTTPModules).
Something like last user activity (just like StackOverflow "Seen 23 mins ago"), and even what Pages and Controllers were used, and pushing even further what buttons or links were clicked.
I have ELMAH installed but as far as i know its just for Error Logging.
PD: Google Analytics is not an option.
Warning: This was written in 2009 for MVC .NET RC1 and may not be syntactically correct anymore.
Action Filter Attributes are perfect for this, just put a call to [YourAttributeName]
at the top of your controller (or if you have an Application Controller which your other controllers inherit from, you only need it once in your application).
For example:
namespace the_name_space
{
[Log]
public class ApplicationController : Controller
{
From this point onwards this attribute will be called before each action is run in your controller(s), you can also specify this on just an action by calling [Log]
just before it in the same fashion.
To get the logging functionality which you require, you will most likely want to override OnResultExecuting
and OnResultExecuted
, both of which are pretty self explanatory.
For example:
public class LogAttribute : ActionFilterAttribute
{
protected DateTime start_time;
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
start_time = DateTime.Now;
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
RouteData route_data = filterContext.RouteData;
TimeSpan duration = (DateTime.Now - start_time);
string controller = (string)route_data.Values["controller"];
string action = (string)route_data.Values["action"];
DateTime created_at = DateTime.Now;
//Save all your required values, including user id and whatnot here.
//The duration variable will allow you to see expensive page loads on the controller, this can be useful when clients complain about something being slow.
}
}