2013-09-12 2 views
0

В моем проекте у меня есть ссылка на DLL, которая использует log4net внутри. В моем Main классе я вставил следующие два утверждения:Нет выхода журнала с вводом инструкции сборки log4net - почему?

using log4net; 
[assembly: log4net.Config.XmlConfigurator(Watch = true)] 

я также подготовил App.Conf файл.

Только с вышесказанным регистрация не начинается. Но когда я дополнительно добавить оператор

private static readonly ILog log = LogManager.GetLogger(typeof(Main)); 

к моему Main класса, лесозаготовительные начинается и все работает отлично.

Зачем мне нужно создать объект ILog для запуска регистрации? Должна ли быть достаточной заявка на сборку с моим файлом App.Conf?

ответ

1

При первом запуске LogManager.GetLogger он пытается определить способ настройки log4net. Он делает это, просматривая в сборку для атрибута log4net.

Если вы не создаете регистратор в своей сборке, то первый раз, когда создается журнал регистрации, будет получена из вашей ссылочной dll, и, следовательно, log4net будет искать атрибут log4net в этой DLL, но не найдет его и поэтому ваша конфигурация будет проигнорирована.

Включив линию

private static readonly ILog log = LogManager.GetLogger(typeof(Main)); 

в главном приложении, то этот метод запускается из вашего EXE и log4net будет искать атрибут в вашем ехе и на этот раз он находит атрибут, а затем переходит к загрузке правильная конфигурация.

Как я понимаю, эта конфигурация выполняется только при первом вызове GetLogger, поэтому важно, чтобы GetLogger вызывался из основного приложения первым.

+0

Спасибо за объяснение. Это был тот момент, который мне не хватало. –

0

я почти всегда использую:

private static readonly NLog.Logger log = LogManager.GetCurrentClassLogger(); 

Это избавляет вас от необходимости делать (TypeOf (Main)), и вы можете просто вырезать и вставить его в какие-либо файлы, которые нужно лесосечных.

Я смущен тем, как вы пытались вызвать журнал, не создавая объект «log». Что вы пытались сделать?

Я бы, наверное, просто использовал строку кода, которую я дал выше.

+0

Благодарим вас за хороший ярлык. К моей проблеме: объект регистрации уже будет создан классами DLL внутри. Каждый класс в ссылке имеет свой собственный объект журнала. Поэтому я смущаюсь создать еще один, который (насколько я вижу) не имеет ничего общего с объектами журнала, используемыми в DLL, на которые ссылается. –

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