Log4Net в объекте Приложения?

Я начинаю с Входом в систему настольного приложения WPF, с помощью Log4Net в качестве регистрирующегося компонента. Вот мой вопрос: В простом настольном приложении, там какая-либо причина не инстанцировать моего регистратора как свойства ov класс Приложения (App.xaml.cs), как это?

public partial class App : Application
{
        private static readonly ILog p_Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        public ILog Logger
        {
            get { return p_Logger; }
        }

        #endregion
    }
}

Это позволило бы мне вызывать регистратор

5
задан David Veeneman 29 March 2010 в 17:16
поделиться

3 ответа

На ум приходит одна причина: поскольку статический конструктор класса App является первым запускаемым битом вашего кода, вы должны создавать экземпляр ILog до того, как вы настроите log4net. Следовательно, ваш экземпляр ILog не будет использоваться. Обычно вместо этого вы делаете что-то вроде этого:

public partial class App : Application
{
    private static ILog log;

    static App()
    {
        XmlConfigurator.Configure();
        log = LogManager.GetLogger(typeof(App));
    }
}

Кстати, этот MethodBase бизнес действительно заставляет меня съеживаться. Почему бы просто не использовать typeof (App) ? В любом случае, вы не должны копировать / вставлять код без проверки ... и typeof (App) будет отлично работать с инструментами рефакторинга ...

7
ответ дан 13 December 2019 в 05:32
поделиться

Я нашел причину не использовать глобальный регистратор в объекте App. Он работает нормально, но есть преимущество в получении регистратора из каждого класса, который будет его использовать - это делает мои сообщения журнала короче и легче писать.

Поэтому я вызываю GetLogger () в каждом классе, который будет регистрировать, и указываю имя, которое будет использоваться для регистратора. Например, в моем методе OpenFile я могу получить такой регистратор:

// Get logger
var logger = LogManager.GetLogger("OpenFile"); 

Это избавляет меня от необходимости вводить имя класса в каждое сообщение об ошибке, которое я пишу. Я все еще настраиваю log4net в конструкторе App (), так как это нужно сделать только один раз. Это дает мне сообщение журнала, которое выглядит следующим образом:

2010-03-29 15:51:41,951 OpenFile [DEBUG]- Data file opened.

Ответ Кента все еще принят, но я решил передать то, что я узнал.

2
ответ дан 13 December 2019 в 05:32
поделиться

Несколько случаев против с использованием одного глобального экземпляра. Используя один регистратор для каждого класса, вы получаете:

  • преимущества иерархии регистраторов, автоматически следующих за структурой вашего класса.
  • меньшее связывание (ваши классы больше не зависят от класса App).
3
ответ дан 13 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: