Asp.Net MVC如何记录被调用的所有操作

问题描述 投票:5回答:3

我需要能够记录从我的asp.net mvc应用程序调用的所有操作。如何以及实现这一目标的最佳方法是什么?在哪里我记录它是否是控制台或日志文件并不重要。

asp.net-mvc logging action
3个回答
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();
    }

}

希望这可以帮助!


2
投票

您可以尝试Audit.NET库及其Audit.MVC和不同的数据提供程序来存储日志文件,eventlog,sql,redis,mongo等等。

使用MVC扩展,您只需要使用属性来装饰控制器或操作:

[Audit]
public class HomeController : Controller
{ ... }

执行静态配置以设置日志的输出:

Audit.Core.Configuration.Setup()
    .UseFileLogProvider(_ => _
        .Directory(@"C:\Logs"));

它将提供记录与MVC应用程序交互的基础结构。


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

希望这有助于某人。

© www.soinside.com 2019 - 2024. All rights reserved.