在 Logging 中使用 StackFrame 和 MethodBase 的区别

Difference between StackFrame and MethodBase when using in Logging

我看到两个单独的代码在实现日志记录时使用 StackFrame 和 MethodBase in.NET。

我知道 MethodBase class 提供了有关方法和构造函数及其来源的信息。 StackFrame 表示在当前线程的调用堆栈上的函数调用

第一个代码使用StackFrame:

StackFrame frame = new StackFrame(1, false);
var method = frame.GetMethod();
var declaringType = method.DeclaringType;

return LogManager.GetLogger(declaringType);

第二个代码使用了MethodBase:

var method = MethodBase.GetCurrentMethod();
var declaringTye = method.DeclaringType;
return LogManager.GetLogger(declaringTye);

为什么要使用第一个代码而不是第二个代码,反之亦然?根据我自己的经验,我知道当您处于应用程序的发布模式时,使用第一个代码会导致问题,因此需要进行一些更改。类似下面的内容。

do
{
   StackFrame frame = new StackFrame(1, false);
   var method = frame.GetMethod();
   var declaringType = method.DeclaringType;
   if (declaringType == null)
   {
       loggerName = method.Name;
       break;
   }
   framesToSkip++;
   loggerName = declaringType.FullName;
} while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
return LogManager.GetLogger(loggerName);

GetCurrentMethod 不允许调用堆栈。一些日志记录实现喜欢跳过日志系统的任何内部结构以使日志更相关。