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。 这使得调查更加方便。
- VS2005:程序集“<assembly>”被错误地指定为一个文件。
- 在Web应用程序中configurationLog4Net
- 什么时候应该使用Tracing vs Logger.NET,Enterprise Library,log4net或Ukadc.Diagnostics?
- log4net与TraceSource
- 消除log4net中的重复日志logging
- Log4Net“无法find架构信息”消息
- 如何解决Nant 0.91的configuration错误?
- 使log4net使用应用程序configuration文件作为configuration数据
- 间歇log4net RollingFileAppenderlocking的文件问题