C# 如何使用惰性工具创建可预测的输出<;StackFrame>;
我正在开发一些内部日志框架,为了提高性能,懒洋洋地获得C# 如何使用惰性工具创建可预测的输出<;StackFrame>;,c#,.net,logging,system.diagnostics,diagnostics,C#,.net,Logging,System.diagnostics,Diagnostics,我正在开发一些内部日志框架,为了提高性能,懒洋洋地获得StackFrame似乎是个好主意。我想使用这个StackFrame来获取日志框架之外的第一个方法 我最初的想法是: using System; using System.Diagnostics; using NUnit.Framework; [TestFixture] public class Test { [Test] public void Caller() { NeedsToNowCaller
StackFrame
似乎是个好主意。我想使用这个StackFrame
来获取日志框架之外的第一个方法
我最初的想法是:
using System;
using System.Diagnostics;
using NUnit.Framework;
[TestFixture]
public class Test
{
[Test]
public void Caller()
{
NeedsToNowCaller();
}
public void NeedsToNowCaller()
{
Processor.GetName(() => new StackFrame(4));
Really();
Assert.AreEqual("Caller", Processor.stackFrame.Value.GetMethod().Name);
}
public void Really()
{
Assert.AreEqual("Caller",Processor.stackFrame.Value.GetMethod().Name);
}
}
public static class Processor
{
public static Lazy<StackFrame> stackFrame;
public static void GetName(Func<StackFrame> stackFrameProvider)
{
stackFrame = new Lazy<StackFrame>(stackFrameProvider);
}
}
结果是不可预测的,因为调用堆栈已更改。无论如何,在保持惰性的同时,是否可以通过闭包获得本地范围/框架的挂钩
我能想到的唯一解决方案是单步通过StackTrace,直到用未知方法检测到第一帧
我真的希望有更好的解决方案。我不知道这是否更好,但与其寻找未知的方法,不如寻找不同的源类。这有点粗糙,但是希望这项工作在进入日志类之前为您提供最后一帧,而不必维护“已知”方法名称列表(假设日志方法不是静态的
我编写了这样一个记录器。所有额外数据都会自动添加。没有必要使用
惰性@Xaqron为什么没有必要?为每个日志消息创建StackFrame会带来开销,因为这些属性并不总是被访问。@JJoos:当没有发生异常时,为什么日志StackFrame
?如果发生异常
,您已经拥有堆栈帧
@Xaqron,因为如果发生错误,它并不总是异常。我还想知道日志记录发生在哪里。@JJoos:如果发生错误,您应该抛出exception
,然后处理它。这就是例外存在的原因。关于异常源,您是对的,您需要StackFrame
,并且已经有一个附加到您的exception
。
Really();
Assert.AreEqual("Caller", Processor.stackFrame.Value.GetMethod().Name);
public void DoStuff()
{
int index = 0;
StackFrame frame = new StackFrame(index++);
while (this.GetType().Name.Equals(frame.GetMethod().DeclaringType.Name))
{
frame = new StackFrame(index++);
}
//...
}