我需要将实际的用户线程ID写入日志文件。如果我使用Thread.CurrentThread.ManagedThreadId
,我不会一次又一次地获得唯一ID,而是一遍又一遍。
原因是在整个系统中跟踪用户log.Info
,稍后如果我发现问题,我将能够在日志WHERE threadId = ?
中搜索并从中获取整个活动流日志中。
我不介意把它放在log4net的代码中。
我说的是服务器线程,而不是手动线程。
答案 0 :(得分:4)
这是不可能的,因为ASP.NET / IIS中的线程正在IIS的线程池上运行...甚至不能保证HTTP请求在同一个线程上完全运行(例如,如果有一些我/ O操作它可以“进入睡眠状态”并从池中重新分配给另一个线程... ...
目标究竟是什么?也许还有其他方法可以实现这一目标......
编辑 - 根据评论:
要跟踪请求,您可以尝试记录该请求的哈希码(可通过GetHashCode()
访问)和/或记录http请求对象的某些属性/字段的值组合的哈希值......
如果你深入挖掘,你可以得到一个工人请求对象,该对象具有(请求特定的)TraceID
属性......
如果您想跟踪完全取决于您的会话管理的会话(无论是隐藏的html表单字段和/或cookie和/或用户和/或其他内容......)。
答案 1 :(得分:3)
您的原始假设不准确:“实际线程”会一次又一次地重复使用,这就是您一次又一次获得相同线程ID的原因。
您的错误是假设每个请求都将由一个单独的线程处理。 ManagedThreadId
工作正常。
现在让我们来看看你想要做什么:
原因是在整个系统中跟踪用户的log.Info
因此,您希望跟踪与用户的互动。不是线程,用户。同一个用户可能在多个线程上进行交互,并且多个用户可能使用相同的线程...所以您要记录的是用户 ID,而不是线程ID。