在使用NLog时,我应该继承类记录器吗

本文关键字:继承 记录器 我应该 NLog | 更新日期: 2024-09-24 20:29:28

从派生类进行日志记录时,我应该从基类继承类记录器实例,还是实例化一个新实例

也就是说,哪个更好:

public class Base
{
    private static Logger _logger = LogManager.GetCurrentClassLogger();
    private void Foo()
    {
        _logger.Info("Hello world");
    }
}
public class Derived : Base
{
    new private static Logger _logger = LogManager.GetCurrentClassLogger();
    private void Fee()
    {
        _logger.Info("Hello world");
    }
}

或:

public class Base
{
    protected static Logger _logger = LogManager.GetCurrentClassLogger();
    private void Foo()
    {
        _logger.Info("Hello world");
    }
}
public class Derived : Base
{
    private void Fee()
    {
        _logger.Info("Hello world");
    }
}

在使用NLog时,我应该继承类记录器吗

您应该使用一个新的。

LogManager.GetCurrentClassLogger创建一个记录器,其名称为当前类。如果使用父类的类记录器,则会丢失进行日志记录的类的信息,这将显示为日志记录是由父类完成的。大多数情况下,在日志记录时,您需要尽可能精确的信息。

我认为Falanwe的答案可能是发布时唯一正确的答案。然而,NLogwiki现在也提出了另一种模式:

public class Base
{
    protected Base()
    {
        _logger = LogManager.GetLogger(GetType().ToString());
    }
    protected Logger _logger { get; private set; }
    private void Foo()
    {
        _logger.Info("Hello world");
    }
}
class ExactClass : BaseClass
{
    public ExactClass() : base() { }
    private void Fee()
    {
        _logger.Info("Hello world");
    }
}

IMHO 有优点也有缺点

  • Pro:子类中的代码较少(DRY)
  • Con:记录器不是静态的,因此每个实例都创建自己的记录器。NLog最佳实践说";创建一个新的Logger开销很小,因为它必须获取锁和分配对象