在 child class 中使用 parent class 记录器

Using parent class logger in child class

我有一个用于所有控制器的基础 class,记录器在此处定义:

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");
    }
}

现在,当我从 child class 使用 Logger 时,日志条目将 BaseService 显示为记录器。有没有办法告诉日志管理器为 child class 实例化记录器?

以下是您的操作方法:

public abstract class BaseService
{
    protected ILogger Logger => LogManager.GetLogger(this.GetType().FullName);
}

请注意 GetLogger 在内部缓存记录器(针对每个不同的名称),这样您就不会在每次获得 Logger 属性 时都创建一个新的记录器。

这里的技巧是 this.GetType().FullName 将 return 派生类型的名称,而不是 BaseService

作为更高效的实施方式:

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