我为所有控制器都有一个基类,并在其中定义了记录器:
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显示为记录器。是否有一种方法可以告诉日志管理器实例化子类的记录器?
发布于 2016-01-31 20:55:17
以下是您可以这样做的方法:
public abstract class BaseService
{
protected ILogger Logger => LogManager.GetLogger(this.GetType().FullName);
}请注意,GetLogger在内部缓存记录器(针对每个不同的名称),这样您就不会每次获得Logger属性时都创建一个新的记录器。
这里的诀窍是this.GetType().FullName将返回派生类型的名称,而不是BaseService。
发布于 2016-02-01 12:06:46
作为更好的执行方式,将是:
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不是。
https://stackoverflow.com/questions/35119222
复制相似问题