NLog - Расширение Nlog - CallSite - dispose () - PullRequest
2 голосов
/ 15 марта 2012

Я пытаюсь использовать NLog для регистрации некоторых вещей в нашей системе.Это очень сложная система, многопоточность с очередями сообщений в разных местах.

Нам нужно было расширить NLog, чтобы регистрировать некоторые другие элементы так, как нам нужно.После расширения NLog мы обнаружили, что информация о месте вызова неверна.Некоторые поиски в стеке дали мне решение.Теперь я обеспокоен тем, что с расширением, которое мы сделали (передав TypeName), у нас может быть несколько сотен экземпляров журнала, и у меня плохое предчувствие, что это будет очень быстро скопировано.

Я не вижуметод dispose для NLog, так что я не знаю, как сборщик мусора поднимет это.

Если у меня есть 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 голосов
/ 19 марта 2012

Типичный шаблон для создания ваших экземпляров регистратора с NLog (и с log4net в этом отношении) состоит в том, чтобы сделать что-то подобное в каждом классе:

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

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

Таким образом, существует только один экземпляр экземпляра регистратораза класс (у которого есть регистратор, созданный как выше).Таким образом, не должно быть проблемы создания чрезмерного количества регистраторов просто потому, что создается много экземпляров классов.Кроме того, поскольку типичным шаблоном является использование экземпляров статического регистратора, регистраторы будут действовать в течение всего жизненного цикла приложения (или, возможно, AppDomain), поэтому удаление не требуется.

...