在子类中使用父类记录器

时间:2016-01-31 20:42:14

标签: c# nlog

我有一个所有控制器的基类,并在那里定义了记录器:

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。有没有办法告诉日志管理器实例化子类的记录器?

2 个答案:

答案 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不是。