2010-03-29 15 views
5

Estoy comenzando con Iniciar sesión en una aplicación de escritorio WPF, usando Log4Net como el componente de registro. Aquí está mi pregunta: En una aplicación de escritorio simple, ¿hay alguna razón para no crear una instancia de mi registrador como una propiedad de la clase de la aplicación (App.xaml.cs), como esta?Log4Net en el objeto de la aplicación?

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

     public ILog Logger 
     { 
      get { return p_Logger; } 
     } 

     #endregion 
    } 
} 

que me permitiera a invocar el registrador

Respuesta

7

Una razón viene a la mente: desde el constructor estático de la clase App es el primer bit del código que se ejecutará, se le crear instancias de la instancia ILog antes has configurado log4net. Por lo tanto, la instancia ILog no será utilizable. En general, debe en su lugar hacer algo como esto:

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

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

Por cierto, que MethodBase negocio realmente me hace temblar. ¿Por qué no usar typeof(App)? No debe copiar/pegar código sin verificarlo, de todos modos ... y typeof(App) funcionará bien con herramientas de refactorización ...

2

Encontré una razón para no usar un registrador global en el objeto de la aplicación. Funciona bien, pero hay una ventaja para obtener un registrador dentro de cada clase que lo usará: hace que mis mensajes de registro sean más cortos y fáciles de escribir.

Llamo a GetLogger() en cada clase que se registrará, y especifico el nombre que se utilizará para el registrador. Por ejemplo, en mi método OpenFile, puedo conseguir un registrador de la siguiente manera:

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

Eso me libera de entrar en el nombre de la clase en cada mensaje de error que escribo. Todavía configuro log4net en el constructor de la aplicación(), ya que solo debe hacerse una vez. Eso me da un mensaje de registro que tiene este aspecto: Respuesta

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

de Kent sigue siendo la respuesta aceptada, pero pensé que había que pasar a lo largo de lo que había aprendido.

+1

+1 para compartir sus propios resultados. –

3

Un par de casos contra usando una instancia global. Mediante el uso de un registrador por clase que se obtiene:

  • el beneficio de las jerarquías del registrador de forma automática después de su estructura de clases.
  • acoplamiento menor (sus clases ya no tienen una dependencia en la clase de la aplicación).
+0

Buenos puntos +1 de mi parte –

Cuestiones relacionadas