首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在子类中使用父类记录器

在子类中使用父类记录器
EN

Stack Overflow用户
提问于 2016-01-31 20:42:13
回答 2查看 2.8K关注 0票数 6

我为所有控制器都有一个基类,并在其中定义了记录器:

代码语言:javascript
运行
复制
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显示为记录器。是否有一种方法可以告诉日志管理器实例化子类的记录器?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-31 20:55:17

以下是您可以这样做的方法:

代码语言:javascript
运行
复制
public abstract class BaseService
{
    protected ILogger Logger => LogManager.GetLogger(this.GetType().FullName);
}

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

这里的诀窍是this.GetType().FullName将返回派生类型的名称,而不是BaseService

票数 6
EN

Stack Overflow用户

发布于 2016-02-01 12:06:46

作为更好的执行方式,将是:

代码语言:javascript
运行
复制
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不是。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35119222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档