为什么大多数log4net示例通过执行以下操作获取类的记录器:
private static ILog logger = LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
而不是仅仅传递typeof(MyClass):
private static ILog logger = LogManager.GetLogger(typeof(MyClass));
除了第一个选项不要求您键入特定的类名这一事实之外,还有其他原因吗?
我想你有理由.我这样做,所以我不必担心类名,只需在一个新类中复制和粘贴样板代码.
有关官方答案,请参阅:如何在静态块中获取类的完全限定名称?在log4net常见问题
正如你所说的那样 - 方便,因为你可以在方法中创建一个记录器而不知道类的名称(我知道很简单),但允许你在类之间剪切和粘贴方法而不必重命名调用.
我是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写一些类似的扩展或静态方法,而不是将反射作为我的锅炉代码的一部分粘贴:)