C# ASP.NET MVC控制器扩展方法,使日志可供所有控制器使用
是否可以扩展Asp.net MVC中的控制器类型,使所有控制器类都可以使用一种方法来记录应用程序?C# ASP.NET MVC控制器扩展方法,使日志可供所有控制器使用,c#,asp.net,.net,asp.net-mvc,extension-methods,C#,Asp.net,.net,Asp.net Mvc,Extension Methods,是否可以扩展Asp.net MVC中的控制器类型,使所有控制器类都可以使用一种方法来记录应用程序? 我试过这个: public static class ControllerExtensions { public static ILog Log(this Controller controller) { log4net.Config.XmlConfigurator.Configure(); return lo
我试过这个:
public static class ControllerExtensions
{
public static ILog Log(this Controller controller)
{
log4net.Config.XmlConfigurator.Configure();
return log4net.LogManager.GetLogger(controller.GetType());
}
}
但是,如果我尝试访问中的方法:
Controller.Log.Info("hello");
它不会编译,错误消息为:“System.Web.Mvc.Controller”不包含“Log”的定义
我有一个using语句将静态类引入范围
任何帮助都会很好。雅克试试看
//inside a controller's method
this.Log().Info("hello");
您不是在添加属性Log
,而是在添加扩展方法Log()
没有“扩展属性”之类的东西。为此,我建议实现抽象的基本控制器类:
public abstract class BaseController : Controller
{
public ILog Log
{
get { return LogManager.GetLogger(GetType()); }
}
}
您还可以使用受保护的静态
日志实例实现类似的结果,下面是一个Serilog
示例:
protected static readonly ILogger log = Log.ForContext(typeof(MyController));
创建自定义操作筛选器如何 创建ActionFilterattribute继承的类LogInfo
public class LogInfo : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//Logging operation code here
}
}
控制器:
[LogInfo]
public ActionResult Index()
{
return View();
}
我最终采用了这种方法。谢谢AndreiI喜欢这种方法。我使用了@Andrei的方法,但我对你的答案感兴趣。对于这个过滤器,如果它不仅仅是一个标准的信息日志,我将如何设置特定的日志条件。例如,如果Index方法内部发生异常,我可以使用筛选器记录异常吗?