argumento log4net para LogManager.getLogger


¿Por qué la mayoría de los ejemplos de log4net obtienen el registrador de una clase haciendo esto:

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

En lugar de simplemente pasar typeof(MyClass):

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?

 94
Author: Andy White, 2009-03-25

4 answers

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

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

 89
Author: Steven Lyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-03 14:32:15

Como usted dice - es conveniente ya que puede crear un registrador en un método sin saber el nombre de la clase (trivial que sé), pero le permite cortar y pegar métodos entre clases sin tener que cambiar el nombre de la llamada.

 7
Author: Preet Sangha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-25 02:53:30

Soy un usuario de NLog, y por lo general esto se reduce a:

var _logger = LogManager.GetCurrentClassLogger();

Parecía un poco extraño que necesitaras pasar por la reflexión en Log4Net, así que eché un vistazo en el código fuente de NLog, y he aquí, esto es lo que hacen por ti:

[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 escribiría algo similar para Log4Net como una extensión o método estático en lugar de pegar el reflejo como parte de mi código de caldera:)

 7
Author: Noctis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-19 02:05:37

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

 3
Author: PeterB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-24 09:03:46