我需要能够记录从我的asp.net mvc应用程序调用的所有操作。如何以及实现这一目标的最佳方法是什么?在哪里我记录它是否是控制台或日志文件并不重要。
答案 0 :(得分:12)
您可以创建自己的类,该类继承自ActionFilterAttribute,然后覆盖OnActionExecuting方法。
示例强>
public class LogActionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.RequestContext.RouteData.Values["Controller"];
var action = filterContext.RequestContext.RouteData.Values["Action"];
//
// Perform logging here
//
base.OnActionExecuting(filterContext);
}
}
public class HomeController : Controller
{
[LogAction]
public ActionResult Index()
{
return View();
}
}
希望这有帮助!
答案 1 :(得分:2)
您可以尝试Audit.NET库及其Audit.MVC以及不同的数据提供程序来将日志存储在文件,事件日志,sql,redis,mongo等等。
使用MVC扩展名,您只需要使用属性修饰控制器或操作:
[Audit]
public class HomeController : Controller
{ ... }
执行静态配置以设置日志的输出:
Audit.Core.Configuration.Setup()
.UseFileLogProvider(_ => _
.Directory(@"C:\Logs"));
它将提供记录与MVC应用程序交互的基础结构。
答案 2 :(得分:0)
向HeyMega致谢。这是我在MVC5中获得的扩展实现的示例。
public class LogActionAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controller = filterContext.RequestContext.RouteData.Values.ContainsKey("Controller") ? filterContext.RequestContext.RouteData.Values["Controller"].ToString() : null;
var action = filterContext.RequestContext.RouteData.Values.ContainsKey("Action") ? filterContext.RequestContext.RouteData.Values["Action"].ToString() : null;
var area = filterContext.RequestContext.RouteData.DataTokens.ContainsKey("Area") ? filterContext.RequestContext.RouteData.DataTokens["Area"].ToString() : null;
var user = filterContext.RequestContext.HttpContext.User.Identity.GetUserId();
Task.Run(() => Generic().AreaActionLog(user, area, controller, action));
base.OnActionExecuting(filterContext);
}
}
我选择将实际登录的方法分离到一个单独的进程中,如果数据库交互出现任何问题,或者数据库交互需要几秒钟,那么UI不会中断。
然后您可以像这样用[LogAction]
属性装饰整个控制器。
[LogAction]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Contact()
{
return View();
}
}
或通过装饰单个方法有选择地应用属性:
public class HomeController : Controller
{
[LogAction]
public ActionResult Index_Logs_Things()
{
return View();
}
}
希望这对某人有帮助。