2012-03-15 3 views
2

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

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

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

Если у меня есть 100 классов, каждый из которых работает на разных потоках, обрабатывая 1000 транзакций в секунду, и каждый из них регистрирует и создает новый экземпляр журнала, я вижу проблемы в будущем.

Я открыт для предложений. Пожалуйста, дайте мне знать, если это будет проблемой, и если да, то возможные решения?

EDIT: Добавление кода: - Вот 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

+1

Я не понимаю, в чем проблема. Почему у вас будет несколько сотен журнальных экземпляров? Объявление вашего регистратора аналогично тому, как я иллюстрирую выше (с учетом того факта, что вы подклассифицировали регистратор), в вашем приложении должен быть один экземпляр регистратора для каждого класса. Итак, если у вас есть 1 класс (который имеет регистратор как статический член), и вы создаете 100 экземпляров класса, у вас будет только один экземпляр регистратора. Можете ли вы опубликовать некоторый код, показывающий, как вы объявляете и создаете регистратор в своих классах? – wageoghe

+0

добавлен код оригинального вопроса – bugnuker

Смежные вопросы