ASP.NET MVC控制器扩展方法,使日志可用于所有控制器

问题描述 投票:5回答:3

是否有可能在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语句将静态类纳入范围。

任何帮助都会很棒。雅克

c# asp.net .net asp.net-mvc extension-methods
3个回答
10
投票

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

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));

5
投票

尝试

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

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

没有“扩展属性”。


2
投票

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

创建由ActionFilterattribute继承的LogInfo类

public class LogInfo : ActionFilterAttribute
    {

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

Controller:

[LogInfo]
public ActionResult Index()
{
   return View();
}
© www.soinside.com 2019 - 2024. All rights reserved.