100 votes

log4net argument pour LogManager.GetLogger

Pourquoi la plupart des exemples de log4net obtiennent le logger pour une classe en faisant ceci :

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

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

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

Y a-t-il une autre raison de procéder ainsi, outre le fait que la première option ne nécessite pas de taper un nom de classe spécifique ?

95voto

Steven Lyons Points 5481

Je pense que vous avez la raison. Je procède de cette façon pour ne pas avoir à me soucier du nom de la classe et pouvoir simplement copier et coller du code passe-partout dans une nouvelle classe.

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

0 votes

Ok, c'est clair, merci pour ce lien, je ne l'avais pas vu avant.

0 votes

C'est aussi vieux que ça, mais jetez un coup d'œil à ma réponse au cas où vous colleriez encore ce code de chaudière :)

0 votes

Vous économisez un tout petit peu de temps Dev couper et coller ce code. Cependant, il y a un coût à l'appel de "GetCurrentMethod()" par rapport à l'utilisation d'une constante de chaîne ou à l'appel de "typeof()". Si vous additionnez le nombre de fois où cet appel sera effectué pendant la durée de vie du code et le temps qu'il vous faudra pour taper le nom de la classe, je pense que vous ne faites que ralentir votre code pour un bénéfice minime.

9voto

Noctis Points 4849

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

var _logger = LogManager.GetCurrentClassLogger();

Il semblait un peu étrange que vous deviez passer par la réflexion dans Log4Net, alors j'ai jeté un coup d'œil dans le code source de NLog, et voilà 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);
}

Je suppose que j'écrirais quelque chose de similaire pour Log4Net en tant qu'extension ou méthode statique au lieu de coller la réflexion dans le code de mon boiler :)

7voto

Preet Sangha Points 39414

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

3voto

PeterB Points 121

Je pense que la raison en est que l'on obtient le type du type d'exécution en utilisant la fonction .DeclaringType() méthode. Vous pouvez utiliser le logger dans une classe de base et toujours voir le type réel de votre objet dans la sortie du logger. Cela rend les enquêtes beaucoup plus convaincantes.

0voto

Il facilite également la création de modèles Codesmith à des fins de génération de code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X