ASP.NET MVC控制器扩展方法,使所有控制器都可以使用Log

本文关键字:控制器 可以使 Log MVC NET 扩展 方法 ASP | 更新日期: 2023-09-27 18:29:56

是否可以在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语句将静态类引入作用域。

任何帮助都会很棒
Jacques

ASP.NET MVC控制器扩展方法,使所有控制器都可以使用Log

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

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

使用protected static日志实例也可以获得类似的结果,下面是一个使用Serilog:的示例

protected static readonly ILogger log = Log.ForContext(typeof(MyController));

尝试

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

您不是在添加属性Log,而是在添加扩展方法Log()

没有所谓的"扩展属性"。

创建一个自定义操作过滤器怎么样?

创建ActionFilterattribute继承的LogInfo类

public class LogInfo : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
           //Logging operation code here
        }
    }

控制器:

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