web-dev-qa-db-fra.com

argument de log4net à LogManager.GetLogger

Pourquoi la plupart des exemples de log4net obtiennent-ils l'enregistreur d'une classe en procédant comme suit:

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

Plutôt que de simplement passer typeof (MyClass):

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

Existe-t-il une autre raison pour cela, outre le fait que la première option ne vous oblige pas à saisir un nom de classe spécifique?

98
Andy White

Je pense que vous avez la raison. Je le fais de cette façon afin de ne pas avoir à m'inquiéter du nom de la classe, je peux simplement copier et coller le code de la plaque de la chaudière dans une nouvelle classe.

Pour la réponse officielle, voir: Comment obtenir le nom qualifié complet d'une classe dans un bloc statique? à la log4net faq

92
Steven Lyons

Comme vous le dites - c’est pratique car vous pouvez créer un enregistreur dans une méthode sans connaître le nom de la classe (trivial je sais) mais vous permet de couper et coller des méthodes entre les classes sans avoir à renommer l’appel.

7
Preet Sangha

Je suis un utilisateur NLog, et cela se résume généralement à:

var _logger = LogManager.GetCurrentClassLogger();

Cela semblait un peu étrange que vous ayez besoin de réfléchir à Log4Net, alors j'ai jeté un œil dans le code source de NLog, et voilà, c'est ce qu'ils font pour vous:

[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);
}

J'imagine que j'écrirais quelque chose de similaire pour Log4Net en tant qu'extension ou méthode statique au lieu de coller le reflet dans le code de ma chaudière :)

7
Noctis

Je pense que la raison en est que vous obtenez le type du type d'exécution à l'aide de la méthode .DeclaringType(). Vous pouvez utiliser le consignateur dans une classe de base et toujours voir le type réel de votre objet dans la sortie du consignateur. Cela rend les enquêtes beaucoup plus pratiques.

3
PeterB