Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取子类名称而不是基?_C#_Logging_Nlog - Fatal编程技术网

C# 如何获取子类名称而不是基?

C# 如何获取子类名称而不是基?,c#,logging,nlog,C#,Logging,Nlog,我有一个基类,使用nlog日志记录。在我的基类中,我有一个在logger对象中传递的方法,然后将其记录到该logger 当它记录它,记录它作为基类时,我希望它会使用子类名 <logger name="Uploads" minlevel="Debug" writeTo="Uploads" /> public void Child : Parent { private readonly Logger logger = LogManager.GetLogger("Uploads

我有一个基类,使用nlog日志记录。在我的基类中,我有一个在logger对象中传递的方法,然后将其记录到该logger

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

<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");
    }
}

公共无效子项:父项
{
专用只读记录器Logger=LogManager.GetLogger(“上载”)
公共无效父方法(记录器)
{
logger.Info(“hi”);
}
}

您可以在
布局中使用
${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}

您可以在
布局中使用
${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 使用和
Name
属性为每个子类显式命名记录器,并将其传递给:

var logger=LogManager.GetLogger(GetType().Name);
解决方法2 创建一个自定义

解决方法3 向基类中添加自定义日志记录方法,这些方法将使用随消息自动添加子类名。下面是一些伪代码示例:

公共类基类
{
受保护的日志记录器=LogManager.GetLogger(“基类”);
受保护的无效日志错误(字符串消息)
{
logger.Error($“{GetType().Name}:{message}”);
}
受保护的void LogInfo(字符串消息)
{
logger.Info($“{GetType().Name}:{message}”);
}
}

简单的答案是NLog团队,因此它尚未解决。然而,有两种变通方法可能会奏效

解决方法1 使用和
Name
属性为每个子类显式命名记录器,并将其传递给:

var logger=LogManager.GetLogger(GetType().Name);
解决方法2 创建一个自定义

解决方法3 向基类中添加自定义日志记录方法,这些方法将使用随消息自动添加子类名。下面是一些伪代码示例:

公共类基类
{
受保护的日志记录器=LogManager.GetLogger(“基类”);
受保护的无效日志错误(字符串消息)
{
logger.Error($“{GetType().Name}:{message}”);
}
受保护的void LogInfo(字符串消息)
{
logger.Info($“{GetType().Name}:{message}”);
}
}

您的参数
logger
将隐藏字段
logger
。这是故意的吗?如果是,那么您得到的记录器名称取决于传入方法的内容。我建议不要将
Loggers
作为参数传递。建议每个类使用静态变量。您的参数
logger
将隐藏字段
logger
。这是故意的吗?如果是,那么您得到的记录器名称取决于传入方法的内容。我建议不要将
Loggers
作为参数传递。建议每个类使用一个静态变量。“简短回答”是建议的解决方案不可能,因为
ReflectedType
在StackTraces上不可用。但是你当然会为NLog项目创建一个请求来证明我错了。是的,描述了如何处理这种情况(您的解决方案1+2基本相同)“简短回答”是建议的解决方案不可能,因为
ReflectedType
在StackTraces上不可用。但是你当然会为NLog项目创建一个请求来证明我错了。是的,描述了如何处理这种情况(您的解决方案1+2基本相同)