StackTrace的独特价值?

时间:2009-11-12 22:19:12

标签: c# .net unique stack-trace

背景: 我在.NET 3.5中编写了一个通用的日志库。基本上,开发人员需要在方法的开头调用Begin()方法,在结尾调用End()方法。这些方法不带参数 - 库使用堆栈跟踪来确定它来自何处。该库有一个集合,可以跟踪调用堆栈并写出每个方法的已用时间。

这很有效,我很满意。

但现在我们想将它添加到服务器。当系统上有多个用户时,只有一个日志文件,并且堆栈跟踪被集中在一起。无法判断哪个线程正在做什么。

我的问题是:

有没有办法从StackTrace类或单个StackFrame中检索唯一值?用反射怎么样?我希望能够为每个用户创建一个单独的文件。至少,我希望能够使用唯一值标记每一行,以便我们可以在查看跟踪时按此值过滤文件。

我们正在使用WCF TcpBinding作为我们的服务器端通信协议,如果这有帮助的话。我正在寻找线程ID,哈希码,地址,以区分调用堆栈的来源。

有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用与当前线程关联的内容 - 也许是thread id?。

线程池中的线程被重用,因此您会在整个日志文件中看到id重复,但是对于Begin / End对的生命周期,它将唯一标记单个用户。

答案 1 :(得分:1)

如果您使用某种形式的面向方面编程(如Postsharp),您可能会找到一种更好的声明方式来获取所需的信息。 Thread.CurrentThread.ManagedThreadId会为您提供当前运行代码的线程的参考,但您的所有开发人员必须做的是将属性应用于方法,而不是调用Begin()和{{1}对于每种方法。

答案 2 :(得分:0)

要获取当前线程正在运行的用户帐户,您可以使用WindowsIdentity.GetCurrent()