【问题标题】:NLog. Change class name日志。更改班级名称
【发布时间】:2011-09-07 06:56:34
【问题描述】:

我想知道是否有任何方法可以在运行时更改记录器实例的类名?我不想在每个类中创建记录器,而是通过构造函数注入它。但是在我这样做之后,我得到了调用事件的文件错误的类名。项目结构是这样的

public class c1
{
    private Logger _logger = LogManager.GetCurrentClassLogger();
    public void doSmth()
    {
        c2 myC2= new c2(_logger);
        myC2.LogSomething();
    }

    public void LogSomething()
    {
        _logger.Info("c1 test");
    }
}


public class c2
{
    private Logger _logger;

    public c2(Logger logger)
    {
        this._logger = logger;
    }

    public void LogSomething() {
        _logger.Info("c2 test");
    }
}

一切正常,但在日志文件中我们得到

2011-09-07 09:33:59.7521|INFO|c1|c1 测试
2011-09-07 09:33:59.7611|INFO|c1|c2 测试

【问题讨论】:

  • 您是否有特定原因不想为每个类创建记录器?
  • 这是正常行为。您的记录器仅在c1 类中初始化,因此记录器名称将始终为c1。如果您希望记录器名称成为您当前的类名,最好的方法仍然是使用private Logger _logger = LogManager.GetCurrentClassLogger(); 在每个类中创建一个记录器。我不明白你为什么不想这样做。你能解释一下为什么这对你来说是个问题吗?
  • 记录器实例可以是静态的。这样,您可以节省 CPU 时间和资源。私有静态 Logger _logger = LogManager.GetCurrentClassLogger();

标签: c# logging nlog


【解决方案1】:

使用${callsite} 渲染器代替${logger} 布局渲染器。

<target xsi:type="Trace" 
            name="t"  
 layout="${callsite:className=true:includeSourcePath=false:methodName=false}
 | ${message}" />

这应该会产生您预期的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多