NLog - 扩展Nlog - callsite - dispose()

时间:2012-03-15 17:10:42

标签: c# .net nlog

我正在尝试使用NLog来记录我们系统中的一些内容。这是一个非常复杂的系统,多线程,在不同的地方有消息队列。

我们需要扩展NLog以我们需要的方式记录其他一些项目。 在扩展NLog之后,我们发现呼叫站点信息是错误的。一些在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);
           }
     }

1 个答案:

答案 0 :(得分:0)

使用NLog(以及log4net)创建记录器实例的典型模式是在每个类中执行以下操作:

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

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

这样,每个类只实例化一个记录器实例(具有如上创建的记录器)。因此,不应该仅仅因为创建了许多类实例而导致创建过多记录器的问题。此外,由于典型模式是使用静态记录器实例,因此记录器将在应用程序的整个生命周期(或可能是AppDomain)中保持有效,因此不需要Dispose。