繁体   English   中英

如何获得子类名称而不是基类名称?

[英]How to get Child Class Name Instead of Base?

我有一个基类并使用 nlog 日志记录。 在我的基类中,我有一个方法可以传入一个记录器对象,然后将它记录到该记录器中。

当它记录它时,将它记录为基类,我希望它会使用子类名称。

<logger name="Uploads" minlevel="Debug" writeTo="Uploads" />


public void Child : Parent
{
    private readonly Logger logger = LogManager.GetLogger("Uploads")

    public void ParentMethod(Logger logger)
    {
            logger.Info("hi");
    }
}

您可以在layout使用${callsite}来确定日志消息的格式。

layout="${longdate}|${level:uppercase=true}|${callsite:includeNamespace=false:className=true:fileName=false:includeSourcePath=false:methodName=false}|${message}"

这将以以下格式记录消息:

2018-03-15 18:11:43.1173|TRACE|{className}|{message}

简短的回答是 NLog 团队认为这是一个重大更改,因此尚未解决。 但是,有几种解决方法可能有效。

解决方法 1

使用GetType()Name属性为每个子类显式命名记录器并将其传递给GetLogger

var logger = LogManager.GetLogger(GetType().Name);

解决方法 2

创建一个自定义子类 logger

解决方法 3

添加到基类自定义日志记录方法,这些方法使用GetType().Name和消息自动添加子类名称。 下面是一些示例伪代码:

public class BaseClass
{
    protected Logger logger = LogManager.GetLogger("BaseClass");
  
    protected void LogError(string message)
    {
        logger.Error($"{GetType().Name}: {message}");
    }

    protected void LogInfo(string message)
    {
        logger.Info($"{GetType().Name}: {message}");
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM