在 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
不是。
我有一个用于所有控制器的基础 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
不是。