Argument log4net pour LogManager.GetLogger

Pourquoi la plupart des exemples log4net obtiennent-ils le journal pour une classe en procédant comme suit:

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

Plutôt que de passer typeof (MyClass):

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

Y a-t-il une autre raison à cela, à part le fait que la première option ne vous oblige pas à taper un nom de classe spécifique?

Je pense que vous avez la raison. Je le fais de cette façon, donc je n’ai pas à me soucier du nom de la classe et 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 puis-je obtenir le nom complet d’une classe dans un bloc statique? à la FAQ log4net

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 (sortingvial que je connaisse) mais vous permet de couper et coller des méthodes entre les classes sans avoir à renommer l’appel.

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

 var _logger = LogManager.GetCurrentClassLogger(); 

Il a semblé un peu étrange que vous ayez besoin de réfléchir à Log4Net, alors j’ai jeté un coup d’oeil dans le code source de NLog, et voilà, c’est ce qu’ils font pour vous:

 [MethodImpl(MethodImplOptions.NoInlining)] public static Logger GetCurrentClassLogger() { ssortingng 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", SsortingngComparison.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 reflection dans le cadre de mon code de chaudière 🙂

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 object dans la sortie des enregistreurs. Cela rend les enquêtes beaucoup plus convaincantes.