ASP.NET MVC Controller扩展方法使Log可供所有控制器使用

时间:2013-09-02 08:26:25

标签: c# asp.net .net asp.net-mvc extension-methods

是否可以在Asp.net MVC中扩展Controller类型,以便为所有控制器类提供应用程序日志记录的方法?
我试过这个:

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语句将静态类带入范围。

任何帮助都会很棒 雅克

3 个答案:

答案 0 :(得分:9)

我建议为此目的实现抽象基类控制器类:

public abstract class BaseController : Controller
{
    public ILog Log
    {
        get { return LogManager.GetLogger(GetType()); }
    }
}

答案 1 :(得分:4)

尝试

//inside a controller's method
this.Log().Info("hello");

您没有添加属性Log,而是添加了扩展方法Log()

没有“扩展属性”这样的东西。

答案 2 :(得分:2)

如何创建自定义操作过滤器?

创建一个由ActionFilterattribute继承的类LogInfo

public class LogInfo : ActionFilterAttribute
    {

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
           //Logging operation code here
        }
    }

<强>控制器:

[LogInfo]
public ActionResult Index()
{
   return View();
}