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

Emi*_*nem 6 asp.net-mvc logging action

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

hey*_*ega 14

您可以创建自己的类,该类继承自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();
    }

}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 对于任何想要非常日志的人(比如我自己),您可以将 [LogAction] 属性添加到整个类的上方,例如 [LogAction} public class HomeController : Controller{} 而不是单个控制器。 (2认同)

Ric*_*ard 7

感谢 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我选择将执行实际日志记录的方法分离到一个单独的进程中,如果数据库交互出现任何问题,或者数据库交互需要几秒钟,UI 不会中断。

然后,您可以使用属性来装饰整个控制器,[LogAction]如下所示。

[LogAction]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Contact()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者通过装饰各个方法来选择性地应用该属性:

public class HomeController : Controller
{
    [LogAction]
    public ActionResult Index_Logs_Things()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这对某人有帮助。