LogManager.GetLogger的log4net参数

为什么大多数log4net的例子都是这样做的:

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

而不是只传递typeof(MyClass):

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

除了第一个选项不需要input特定类名之外,是否还有其他的原因呢?

我想你有理由 我这样做,所以我不必担心类名称,只能复制和粘贴锅炉板代码在一个新的类。

有关官方的答案,请参阅:如何获取静态块中的类的完全限定名称? 在log4net常见问题

正如你所说 – 它的方便,你可以创build一个方法中的logging器而不知道类的名字(我知道微不足道的),但允许您在类之间剪切和粘贴方法,而不必重命名该调用。

我是一个NLog用户,通常这可以归结为:

 var _logger = LogManager.GetCurrentClassLogger(); 

看起来有点奇怪,你需要在Log4Net中进行反思,所以我看了一下NLog的源代码,瞧,这是他们为你做的:

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

我想我会写一些类似的Log4Net作为扩展或静态方法,而不是粘贴reflection作为我的锅炉代码的一部分:)

我认为原因是,你使用.DeclaringType()方法获得运行时types的types。 您可以在基类中使用logging器,并可以在logging器输出中看到对象的实际types。 这使得调查更加方便。