ASP.NET MVC自定义过滤属性实现log功能("ASP.NET MVC 自定义过滤器实现日志记录功能")

原创
ithorizon 4周前 (10-20) 阅读数 14 #后端开发

ASP.NET MVC 自定义过滤器实现日志记录功能

在ASP.NET MVC应用程序中,日志记录是一项非常重要的功能,它可以帮助我们跟踪应用程序的运行状态、发现和解决问题。通过自定义过滤器,我们可以在控制器动作执行前后添加日志记录功能。本文将介绍怎样在ASP.NET MVC中创建一个自定义过滤器,并在控制器中使用它来实现日志记录功能。

一、创建自定义过滤器

首先,我们需要创建一个自定义过滤器。自定义过滤器是一个实现了特定接口的类,这里我们选择实现IActionFilter接口。下面是创建自定义过滤器的步骤:

1. 创建自定义过滤器类

在项目中创建一个新的类文件,命名为LogFilterAttribute.cs。然后在该文件中实现IActionFilter接口,并添加日志记录的逻辑:

using System;

using System.Web.Mvc;

public class LogFilterAttribute : ActionFilterAttribute

{

public override void OnActionExecuting(ActionExecutingContext filterContext)

{

// 记录动作执行前的日志

string controllerName = filterContext.Controller.ToString();

string actionName = filterContext.ActionDescriptor.ActionName;

string logMessage = $"起初执行动作:{controllerName}.{actionName}";

Log(logMessage);

}

public override void OnActionExecuted(ActionExecutedContext filterContext)

{

// 记录动作执行后的日志

string controllerName = filterContext.Controller.ToString();

string actionName = filterContext.ActionDescriptor.ActionName;

string logMessage = $"完成执行动作:{controllerName}.{actionName}";

Log(logMessage);

}

private void Log(string message)

{

// 这里使用Console.WriteLine进行日志记录,实际项目中可以使用日志库

Console.WriteLine($"{DateTime.Now}:{message}");

}

}

2. 注册过滤器

在Global.asax文件中,我们需要注册自定义过滤器,以便在控制器动作中使用它。注册过滤器的方法有多种,这里我们使用全局过滤器的方法:

using System.Web.Mvc;

public class MvcApplication : System.Web.HttpApplication

{

protected void Application_Start()

{

AreaRegistration.RegisterAllAreas();

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

RouteConfig.RegisterRoutes(RouteTable.Routes);

BundleConfig.RegisterBundles(BundleTable.Bundles);

// 注册全局过滤器

GlobalFilters.Filters.Add(new LogFilterAttribute());

}

}

二、在控制器中使用自定义过滤器

注册完过滤器后,我们可以在控制器中使用它。以下是一个示例控制器,它使用了我们创建的LogFilterAttribute过滤器:

using System.Web.Mvc;

[LogFilter]

public class HomeController : Controller

{

public ActionResult Index()

{

return View();

}

public ActionResult About()

{

ViewBag.Message = "Your application description page.";

return View();

}

public ActionResult Contact()

{

ViewBag.Message = "Your contact page.";

return View();

}

}

在这个控制器中,我们使用了[LogFilter]属性来标记整个控制器。这意味着该控制器中的所有动作都会自动应用日志记录功能。当然,我们也可以针对单个动作使用过滤器,方法是在对应的动作方法上添加[LogFilter]属性。

三、自定义过滤器的高级用法

除了基本的日志记录功能,自定义过滤器还赞成一些高级用法,例如:

1. 过滤器参数

我们可以在自定义过滤器中添加参数,以便在应用过滤器时传递额外的信息。下面是一个带有参数的自定义过滤器示例:

using System;

using System.Web.Mvc;

public class LogFilterAttribute : ActionFilterAttribute

{

private readonly string _category;

public LogFilterAttribute(string category)

{

_category = category;

}

public override void OnActionExecuting(ActionExecutingContext filterContext)

{

string logMessage = $"起初执行动作:{filterContext.Controller.ToString()}.{filterContext.ActionDescriptor.ActionName},类别:{_category}";

Log(logMessage);

}

public override void OnActionExecuted(ActionExecutedContext filterContext)

{

string logMessage = $"完成执行动作:{filterContext.Controller.ToString()}.{filterContext.ActionDescriptor.ActionName},类别:{_category}";

Log(logMessage);

}

private void Log(string message)

{

Console.WriteLine($"{DateTime.Now}:{message}");

}

}

使用时,我们可以在控制器或动作上传递参数:

[LogFilter("Category1")]

public class HomeController : Controller

{

// ...

}

2. 过滤器继承

我们还可以创建一个基过滤器类,然后让其他过滤器继承自它。这样,我们可以在基过滤器中实现共通的功能,然后在派生过滤器中添加特定的逻辑。以下是一个示例:

using System;

using System.Web.Mvc;

public abstract class BaseFilterAttribute : ActionFilterAttribute

{

public override void OnActionExecuting(ActionExecutingContext filterContext)

{

// 共通逻辑

Log($"起初执行动作:{filterContext.Controller.ToString()}.{filterContext.ActionDescriptor.ActionName}");

}

public override void OnActionExecuted(ActionExecutedContext filterContext)

{

// 共通逻辑

Log($"完成执行动作:{filterContext.Controller.ToString()}.{filterContext.ActionDescriptor.ActionName}");

}

protected void Log(string message)

{

Console.WriteLine($"{DateTime.Now}:{message}");

}

}

public class LogFilterAttribute : BaseFilterAttribute

{

// 特定逻辑

}

通过继承基过滤器,我们可以降低代码重复,同时保持自定义过滤器的可维护性。

四、总结

本文介绍了怎样在ASP.NET MVC中创建和使用自定义过滤器来实现日志记录功能。通过自定义过滤器,我们可以在控制器动作执行前后添加日志记录逻辑,从而更好地监控应用程序的运行状态。此外,自定义过滤器还赞成参数传递和继承等高级用法,使日志记录功能更加灵活和可扩展。

在实际项目中,我们可以利用需要选择合适的日志记录库,如NLog、log4net等,以实现更为专业的日志管理。同时,我们还应该关注日志的稳固性和性能问题,确保日志记录不会对应用程序的运行产生负面影响。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门