2011-09-07 90 views
4

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

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 |信息| C1 | C1测试
2011-09 -07 09:33:59.7611 | INFO | c1 | c2 test

+0

是否有一个特定的原因,你不想为每个类创建记录器? – MichaelMocko

+0

这是正常的行为。您的记录器仅在'c1'类中初始化,所以记录器名称将始终为'c1'。如果你想让记录器名称成为你当前的类名,最好的方法是用'private Logger _logger = LogManager.GetCurrentClassLogger();'在每个类中创建一个记录器。我不明白你为什么不想这样做。你能解释一下为什么这是你的问题吗? – Otiel

+1

记录器实例可以是静态的。这样可以节省CPU时间和资源。私人静态记录器_logger = LogManager.GetCurrentClassLogger(); – LostInComputer

回答

2

而不是${logger}布局渲染器,请使用${callsite}渲染器。

​​

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