2010-03-29 3 views
5

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

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

     public ILog Logger 
     { 
      get { return p_Logger; } 
     } 

     #endregion 
    } 
} 

Это позволит мне вызвать РЕГИСТРАТОР

ответ

7

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

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

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

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

2

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

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

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

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

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

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

+1

+1 для обмена собственными результатами. –

3

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

  • Преимущества иерархии регистраторов автоматически следуют за вашей структурой классов.
  • меньшая связь (ваши классы больше не зависят от класса App).
+0

Хорошие очки +1 от меня –

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