Log4Net в объекте приложения? - PullRequest
5 голосов
/ 29 марта 2010

Я начинаю с регистрации в настольном приложении WPF, используя Log4Net в качестве компонента ведения журнала. Вот мой вопрос: есть ли в простом настольном приложении какая-либо причина не создавать экземпляр моего регистратора как свойства класса App (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
    }
}

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

Ответы [ 3 ]

7 голосов
/ 29 марта 2010

На ум приходит одна причина: поскольку статический конструктор класса 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) будет отлично работать с инструментами рефакторинга ...

3 голосов
/ 30 марта 2010

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

  • преимущество иерархий логгеров, автоматически следующих за вашей структурой классов.
  • меньшая связь (ваши классы больше не зависят от класса App).
2 голосов
/ 30 марта 2010

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

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

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

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

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

Ответ Кента по-прежнему является принятым ответом, но я решил, что передам то, что узнал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...