簡體   English   中英

在子類中使用父類記錄器

[英]Using parent class logger in child 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");
    }
}

現在,當我從子類使用Logger時,日志條目將BaseService顯示為logger。 有沒有辦法告訴日志管理器實例化子類的記錄器?

以下是如何做到這一點:

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

請注意, GetLogger在內部緩存記錄器(針對每個不同的名稱),以便每次獲取Logger屬性時都不會創建新的記錄Logger

這里的技巧是this.GetType().FullName將返回派生類型的名稱,而不是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不是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM