我有一个所有控制器的基类,并在那里定义了记录器:
public abstract class BaseService
{
private static readonly ILogger logger = LogManager.GetCurrentClassLogger();
protected ILogger Logger => logger;
}
public class ChildClass : BaseClass
{
public void DoStuff()
{
Logger.Info("Some info");
}
}
现在,当我从子类使用Logger
时,日志条目将BaseService显示为logger。有没有办法告诉日志管理器实例化子类的记录器?
答案 0 :(得分:5)
以下是如何做到这一点:
public abstract class BaseService
{
protected ILogger Logger => LogManager.GetLogger(this.GetType().FullName);
}
请注意GetLogger
在内部缓存记录器(针对每个不同的名称),以便每次获得Logger
属性时都不会创建新的记录器。
这里的诀窍是this.GetType().FullName
将返回派生类型的名称,而不是BaseService
。
答案 1 :(得分:0)
更高效的实施方式是:
public abstract class BaseService
{
protected ILogger Logger { get; private set; }
protected BaseService(Type type)
{
Logger = LogManager.GetLogger(type.FullName);
}
}
public class ChildClass : BaseService
{
public ChildClass()
: base(typeof(ChildClass)) //fast
{
}
public void DoStuff()
{
Logger.Info("Some info");
}
}
因为typeof(ChildClass)
已知编译时,this.GetType().FullName
不是。