为什么大多数log4net示例通过执行以下操作获取类的记录器:
private static ILog logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
Run Code Online (Sandbox Code Playgroud)
而不是仅仅传递typeof(MyClass):
private static ILog logger = LogManager.GetLogger(typeof(MyClass));
Run Code Online (Sandbox Code Playgroud)
除了第一个选项不要求您键入特定的类名这一事实之外,还有其他原因吗?
我是NLog用户,通常归结为:
var _logger = LogManager.GetCurrentClassLogger();
Run Code Online (Sandbox Code Playgroud)
你需要在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);
}
Run Code Online (Sandbox Code Playgroud)
我想我会为Log4Net写一些类似的扩展或静态方法,而不是将反射作为我的锅炉代码的一部分粘贴:)
归档时间: |
|
查看次数: |
79845 次 |
最近记录: |