Asp.Net MVC 如何记录所有被调用的操作
Asp.Net MVC How to log all actions being called
我需要能够记录从我的 asp.net mvc 应用程序调用的所有操作。如何以及什么是实现这一目标的最佳方式?我将其记录到控制台或日志文件的位置并不重要。
您可以创建自己的 class,它继承自 ActionFilterAttribute and then override the 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();
}
}
希望对您有所帮助!
您可以尝试 Audit.NET library with its Audit.MVC 和不同的数据提供者将日志存储在文件、事件日志、sql、redis、mongo 等等。
使用 MVC 扩展,你只需要用属性装饰你的控制器或动作:
[Audit]
public class HomeController : Controller
{ ... }
执行静态配置以设置日志输出:
Audit.Core.Configuration.Setup()
.UseFileLogProvider(_ => _
.Directory(@"C:\Logs"));
并且它将提供基础结构来记录与您的 MVC 应用程序的交互。
他们的回答归功于 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();
}
}
希望这对某人有所帮助。
我需要能够记录从我的 asp.net mvc 应用程序调用的所有操作。如何以及什么是实现这一目标的最佳方式?我将其记录到控制台或日志文件的位置并不重要。
您可以创建自己的 class,它继承自 ActionFilterAttribute and then override the 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();
}
}
希望对您有所帮助!
您可以尝试 Audit.NET library with its Audit.MVC 和不同的数据提供者将日志存储在文件、事件日志、sql、redis、mongo 等等。
使用 MVC 扩展,你只需要用属性装饰你的控制器或动作:
[Audit]
public class HomeController : Controller
{ ... }
执行静态配置以设置日志输出:
Audit.Core.Configuration.Setup()
.UseFileLogProvider(_ => _
.Directory(@"C:\Logs"));
并且它将提供基础结构来记录与您的 MVC 应用程序的交互。
他们的回答归功于 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();
}
}
希望这对某人有所帮助。