2009-03-25 7 views
88

¿Por qué los ejemplos más log4net obtener el registrador para una clase al hacer esto:log4net a LogManager.GetLogger

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

En lugar de simplemente pasar typeof (MiClase):

private static ILog logger = LogManager.GetLogger(typeof(MyClass)); 

¿Hay alguna otra razón para hacer esto, además del hecho de que la primera opción no requiere que escriba un nombre de clase específico?

Respuesta

85

Creo que tienes el motivo. Lo hago de esa manera, así que no tengo que preocuparme por el nombre de la clase y puedo copiar y pegar el código de la placa de la caldera en una nueva clase.

Para la respuesta oficial, ver: ¿Cómo puedo obtener el nombre completo de una clase en un bloque estático? en el log4net faq

+0

Ok que lo aclara, gracias por ese enlace, que no había visto antes –

+0

Esto es tan antigua como se pone, pero echar un vistazo a mi respuesta en caso de que todavía pegar que a medida que el código de la caldera :) – Noctis

+0

Usted ahorra un poco de tiempo Dev cortando y pegando este código. Sin embargo, hay un costo al llamar a 'GetCurrentMethod()' en lugar de usar una constante de cadena o llamar a 'typeof()'. Si suma cuántas veces se invocará esto a lo largo de la vigencia del código, en relación con el tiempo que tardará en escribir el nombre de la clase, creo que está reduciendo la velocidad de su código para obtener pocos beneficios. – Youngs

7

Como dices - es conveniente ya que puedes crear un registrador en un método sin saber el nombre de la clase (trivial que conozco) pero te permite cortar y pegar métodos entre clases sin tener que cambiar el nombre de la llamada.

3

Creo que la razón es que obtiene el tipo del tipo de tiempo de ejecución utilizando el método .DeclaringType(). Puede usar el registrador en una clase base y aún ver el tipo real de su objeto en la salida de los registradores. Eso hace que las investigaciones sean mucho más convenientes.

6

soy un usuario Nlog, y por lo general esto se reduce a:

var _logger = LogManager.GetCurrentClassLogger(); 

Parecía un poco extraño que tiene que ir a través de la reflexión en Log4net, así que tuve un vistazo en el código fuente Nlog , y he aquí, esto es lo que hacen para usted:

[MethodImpl(MethodImplOptions.NoInlining)] 
public static Logger GetCurrentClassLogger() 
{ 
    string loggerName; 
    Type declaringType; 
    int framesToSkip = 1; 
    do 
    { 
#if SILVERLIGHT 
     StackFrame frame = new StackTrace().GetFrame(framesToSkip); 
#else 
     StackFrame frame = new StackFrame(framesToSkip, false); 
#endif 
     var method = frame.GetMethod(); 
     declaringType = method.DeclaringType; 
     if (declaringType == null) 
     { 
      loggerName = method.Name; 
      break; 
     } 
     framesToSkip++; 
     loggerName = declaringType.FullName; 
    } while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase)); 
    return globalFactory.GetLogger(loggerName); 
} 

supongo que iba a escribir algo similar para log4net como una extensión o un método estático en lugar de pegar la reflexión como parte de mi código de calderas :)