C# 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

是否可以扩展Asp.net MVC中的控制器类型,使所有控制器类都可以使用一种方法来记录应用程序?
我试过这个:

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方法内部发生异常,我可以使用筛选器记录异常吗?