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();
    }
}

希望这对某人有所帮助。