c# - 对于 C# 日志记录,如何以最小的开销获取调用堆栈深度?

标签 c# logging callstack

我为 Log4net 创建了一个包装器(我可能会放弃支持 NLog;我还没有决定),并且我缩进记录的消息结果以给出调用结构的想法。例如:

2011-04-03 00:20:30,271 [CT] DEBUG  -     Merlinia.ProcessManager.CentralThread.ProcessAdminCommand - ProcStart - User Info Repository
2011-04-03 00:20:30,271 [CT] DEBUG  -      Merlinia.ProcessManager.CentralThread.StartOneProcess - User Info Repository
2011-04-03 00:20:30,411 [CT] DEBUG  -       Merlinia.ProcessManager.CentralThread.SetProcessStatus - Process = User Info Repository, status = ProcStarting
2011-04-03 00:20:30,411 [CT] DEBUG  -        Merlinia.ProcessManager.CentralThread.SendProcessStatusInfo
2011-04-03 00:20:30,411 [CT] DEBUG  -         Merlinia.CommonClasses.MhlAdminLayer.SendToAllAdministrators - ProcessTable
2011-04-03 00:20:30,411 [CT] DEBUG  -          Merlinia.CommonClasses.MReflection.CopyToBinary
2011-04-03 00:20:30,411 [CT] DEBUG  -           Merlinia.CommonClasses.MReflection.CopyToBinary - False
2011-04-03 00:20:30,411 [CT] DEBUG  -          Merlinia.CommonClasses.MhlBasicLayer.SendToAllConnections - 228 - True - False
2011-04-03 00:20:30,411 [CT] DEBUG  -           Merlinia.CommonClasses.MmlNonThreaded.SendObject - 228
2011-04-03 00:20:30,411 [CT] DEBUG  -            Merlinia.CommonClasses.MllTcpSocket.SendMessage - 228 - True
2011-04-03 00:20:32,174 [10] DEBUG  -    Merlinia.CommonClasses.MReflection.CreateFromBinary
2011-04-03 00:20:32,174 [10] DEBUG  -     Merlinia.CommonClasses.MReflection.CopyFromBinary - Bytes = 71
2011-04-03 00:20:32,174 [CT] DEBUG  - Merlinia.ProcessManager.CentralThread.MessagingCallback - User Info Repository - ProcessInfoAndRequests
2011-04-03 00:20:32,174 [CT] DEBUG  -  Merlinia.ProcessManager.CentralThread.ProcessProcessInfoAndRequests - User Info Repository

我使用 System.Diagnostics.StackTrace 并计算 StackFrames 来执行此操作。

现在的问题是:有没有更有效的方法来做到这一点?我只需要确定(相对)调用堆栈深度,即当前深度加上或减去上次调用我的日志记录包装器时的深度。 (请注意,我实际上并没有使用 StackFrame 对象——否则我会得到方法名称。)

我希望有一些简单的高性能方法来查询调用堆栈深度或堆栈使用情况。

最佳答案

只需使用 StackTrace.FrameCount属性,并将其与先前记录的 FrameCount 进行比较。仅供引用,FrameCount 可能是检索实际帧数的最快方法,因为它只会将内部 m_iNumOfFrames 字段返回给您。

关于c# - 对于 C# 日志记录,如何以最小的开销获取调用堆栈深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5999177/

相关文章:

c# - 不支持在 xamarin.android 上使用 LINQ 连接 SQLite.Net 中的表

c# - 根据方法参数生成唯一的缓存键

java - Logger.getLogger(class_name.class.getName()) 导致 NullPointerException

c++ - Visual Studio 的图形诊断未捕获任何数据

delphi - 如何在Delphi调用堆栈窗口中隐藏 'non-user'堆栈帧?

c# - 通过套接字作为HTTP服务器正确接收请求数据

c# - 从 Nunit3-console.exe 运行单独测试

c++ - 控制台/文件记录器库 C++

logging - 了解 websphere 应用程序服务器中的 native_stderr 文件

c++ - 在 Windows 的 MinGW 中打印堆栈跟踪