为什么大多数log4net示例通过这样做来获取类的记录器:
private static ILog logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
而不仅仅是传递typeof(MyClass):
private static ILog logger = LogManager.GetLogger(typeof(MyClass));
除了第一个选项不要求您键入特定的类名之外,还有其他原因吗?
发布于 2009-03-25 02:54:05
我想你已经找到原因了。我这样做,所以我不必担心类名,只需将样板代码复制并粘贴到新类中即可。
有关官方答案,请参阅:如何在静态块中获取类的完全限定名称?在log4net faq
发布于 2014-09-19 10:05:38
我是一个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编写类似的扩展或静态方法,而不是将反射粘贴到我的锅炉代码中:)
发布于 2009-03-25 02:53:30
正如你所说,这很方便,因为你可以在不知道类名的情况下在方法中创建记录器(我知道这很简单),但它允许你在类之间剪切和粘贴方法,而不必重命名调用。
https://stackoverflow.com/questions/680044
复制相似问题