Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.NET MVC Controller extension method to make Log available to all controllers

Is it possible to extend the Controller type in Asp.net MVC to make a method available to all controller classes for application logging?
I've tried this:

public static class ControllerExtensions
    {
        public static ILog Log(this Controller controller)
        {
            log4net.Config.XmlConfigurator.Configure();
            return log4net.LogManager.GetLogger(controller.GetType());
        }
    }

But, if I try to access the method as in:

Controller.Log.Info("hello");

It won't compile with the error message: 'System.Web.Mvc.Controller' does not contain a definition for 'Log'

I do have a using statement bringing the static class into scope.

Any help would be great.
Jacques

like image 216
Jacques Avatar asked Sep 02 '13 08:09

Jacques


1 Answers

I would suggest to implement abstract base controller class for this purpose:

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

You can also achieve similar result using protected static log instance, here is an example with Serilog:

protected static readonly ILogger log = Log.ForContext(typeof(MyController));
like image 141
Andrei Avatar answered Oct 06 '22 05:10

Andrei