2012-03-15 27 views
2

我正在尝试使用NLog记录系统中的某些内容。这是一个非常复杂的系统,在不同地方使用消息队列进行多线程。NLog - 扩展Nlog - callsite - dispose()

我们需要扩展NLog来记录我们需要的其他项目。 扩展NLog之后,我们发现callsite信息是错误的。 Stack上的一些搜索给了我一个解决方案。 我现在担心的是,随着我们所做的扩展(传递TypeName),我们可能会有几百个日志实例,并且我很不情愿这样做会非常快速地备份。

我没有看到NLog的dispose方法,所以我不知道垃圾回收会如何挑选它。

如果我有100个班,每个在不同的线程处理1000个事务第二运行,并且每个这些被记录,并创建一个新的日志实例,我看到我的未来问题。

我很乐意提供建议。请让我知道这是否会成为问题,如果有的话,可能的解决方案?

编辑:添加代码: - 这里是ExtenderClass(取类名)

private readonly Logger _logger; 

     public NLogLogger(Type t) 
     { 
      _logger = LogManager.GetLogger(t.FullName); 
     } 
     public void Trace(string message, string systemUserID, string transactionID, string description) 
     { 
      if (_logger.IsTraceEnabled) 
       { 
        Write(LogLevel.Trace, message, systemUserID, transactionID, description); 
       } 
     } 

下面是一个使用它的类 - 这个类将在实例为每个线程任务,所以也许500忙碌的一天。

public class ThreadTask : TaskBase 
    { 
     private readonly NLogLogger _logger = new NLogLogger(typeof(ThreadTask));  
     public Method(string val) 
      { 
       _logger.Trace(message); 
      } 
    } 

回答

0

与NLOG(与log4net的为此事)创建记录器的实例典型的模式是做这样的事情在每个等级:

public class MyClass 
{ 
    private static readonly Logger logger = LogManager.GetCurrentClassLogger(); 

    public void DoSomething() 
    { 
    logger.Debug("Hello from inside DoSomething"); 
    } 
} 

这样,只有一个记录器每个类实例化的实例(具有如上创建的记录器)。所以,不应该因为大量的类实例被创建而造成过多的记录器被创建。此外,由于典型模式是使用静态记录器实例,记录器将在应用程序的整个生命周期(或者AppDomain)中保持有效,因此不需要Dispose。

+0

是的,你是对的。但我扩展nLog,所以我有一个基类。我必须将该类型传递给基类以使该调用点正确。 – bugnuker 2012-04-26 19:53:04

+1

我不明白你有什么问题。你为什么要有几百个日志实例?通过声明你的记录器类似于我上面说明的方式(考虑到你已经记录了记录器的事实),你应该在你的应用程序中为每个类记录一个实例。因此,如果您有1个类(将记录器作为静态成员)并且创建了100个类的实例,则只有1个记录器实例。你能发表一些代码来展示你如何在你的类中声明和创建记录器吗? – wageoghe 2012-04-26 21:08:32

+0

在原始问题中增加了代码 – bugnuker 2012-04-26 22:50:16