ASP.NET MVC自定义过滤属性实现log功能("ASP.NET MVC 自定义过滤器实现日志记录功能")
原创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等,以实现更为专业的日志管理。同时,我们还应该关注日志的稳固性和性能问题,确保日志记录不会对应用程序的运行产生负面影响。