We're using NLog for logging in an C# MVC3 web application. All of our controllers extend a custom base "ApplicationController" that gives us access to a constantly needed methodes and s members.
I'd like all controllers to have access to the Logger via this base class, but want the detail of knowing what derived class the log statements originated in.
Our application controller looks like this:
public abstract class ApplicationController : Controller
{
protected Logger _logger;
protected virtual Logger Logger
{
get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); }
}
protected ApplicationController()
{
Context = new Entities();
}
If a derived controller doesn't override the Logger than all statements will show they originated from the Application controller. Currently, I've got essentially the same Logger statement in all derived controllers. For example:
public class PropertyController : ApplicationController
{
private readonly DatatapeService _datatapeService;
private readonly PropertyService _propertyService;
protected override Logger Logger
{
get { return _logger ?? (_logger = LogManager.GetCurrentClassLogger()); }
}
Obviously this is poor implementation practice.
TIA!
NLog API is slightly different than Log4net. You need to use
Logger = LogManager.GetLogger(GetType().Name);
if you only pass the type, LogManager will expect a logger type (i.e. a custom logger)
I am unfamiliar with NLog but in Log4Net the syntax
LogManager.GetLogger(this.GetType())
will accomplish what you want. GetType
returns the leaf type in your inheritance hierarchy, even if called in the base ApplicationController
class, when the logger is first created (ie: on first access to the Logger property) it will instantiate it with type PropertyController
The How to create Logger for sub classes page of the NLog wiki now suggests the following pattern:
class BaseClass
{
protected BaseClass()
{
Log = LogManager.GetLogger(GetType().ToString());
}
protected Logger Log { get; private set; }
}
class ExactClass : BaseClass
{
public ExactClass() : base() { }
...
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With