对于C#日志记录,如何以最小的开销获得调用堆栈的深度? [英] For C# logging, how do I obtain the call stack depth with minimal overhead?
问题描述
我为 Log4net 创建了一个包装器(我可能会赞成这么做) NLog;我还没有决定),并缩进记录的消息结果以给出调用结构的想法.例如:
I have created a wrapper for Log4net (which I may be dropping in favor of NLog; I haven't decided yet), and I indent the logged messages result to give an idea of calling structure. For example:
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来执行此操作.
I do this using System.Diagnostics.StackTrace and counting StackFrames.
现在这是一个问题:有没有更有效的方法?我只需要确定(相对)调用堆栈的深度,即当前深度加上或减去上一次调用日志记录包装器的深度即可. (请注意,我实际上并没有使用StackFrame对象,否则我会获得方法名称.)
Now here's the question: Is there any more efficient way of doing this? I only need to determine the (relative) call stack depth, i.e., is the current depth plus or minus what it was the last time my logging wrapper was called. (Note that I do not actually use the StackFrame objects - I get the method names otherwise.)
我希望查询呼叫堆栈深度或堆栈使用情况的简单高性能方法.
I'm hoping for some simple high-performance way of querying the call stack depth or stack usage.
推荐答案
Simply use the StackTrace.FrameCount property, and compare it to the previously recorded FrameCount
. FYI, FrameCount
is probably the fastest method to retrieve the actual frame count, since it only returns the internal m_iNumOfFrames
field back to you.
这篇关于对于C#日志记录,如何以最小的开销获得调用堆栈的深度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!