我需要將實際的用戶線程ID寫入日誌文件。如果我使用Thread.CurrentThread.ManagedThreadId
,我沒有得到唯一的ID,但一次又一次地得到相同的ID。獲取唯一的線程ID
的原因是跟蹤log.Info
橫跨整個系統的用戶,以後如果我看到一個問題,我就可以在日誌中WHERE threadId = ?
進行搜索,並從記錄整個活動流程。
我不介意讓它在log4net的代碼裏面。
我說的是服務器線程而不是手動線程。
我需要將實際的用戶線程ID寫入日誌文件。如果我使用Thread.CurrentThread.ManagedThreadId
,我沒有得到唯一的ID,但一次又一次地得到相同的ID。獲取唯一的線程ID
的原因是跟蹤log.Info
橫跨整個系統的用戶,以後如果我看到一個問題,我就可以在日誌中WHERE threadId = ?
進行搜索,並從記錄整個活動流程。
我不介意讓它在log4net的代碼裏面。
我說的是服務器線程而不是手動線程。
這是不可能的,因爲您的ASP.NET/IIS中的線程正在IIS的線程池上運行......它甚至不能保證HTTP請求在同一線程上完全運行(例如,如果有一些I/O操作,它可以「去睡覺」並被重新分配給池中的另一個線程)...
目標是什麼?也許有一些其他的方式來實現這一目標?
編輯 - 按評論:
要跟蹤你可以嘗試登錄該請求的哈希碼(通過GetHashCode()
訪問)和請求/或者記錄http請求對象的一些屬性/字段的值的組合的哈希...
如果你深入挖掘,你可以得到一個工作請求對象,它有一個(請求特定的) TraceID
財產...
如果您想跟蹤完全取決於您的會話管理的會話(無論是隱藏的HTML表單字段和/或cookie和/或用戶和/或其他東西)。
你原來的假設是不準確的:「實際的線程」被重複使用,這就是爲什麼你一次又一次得到相同的線程ID。
你的錯誤是假定每個請求都將由一個單獨的線程處理。 ManagedThreadId
工作正常。
現在讓我們來看看你想要做什麼:
的原因是爲了跨越
所以你要跟蹤與交互系統跟蹤log.Info用戶用戶。不是線程,用戶。同一個用戶可能在多個線程上有交互,並且多個用戶可能使用相同的線程...所以你想要記錄的是用戶ID,而不是線程ID。
'ManagedThreadId'是爲了在託管線程中唯一。你確定你沒有使用線程池中的可重用線程嗎? – Vlad
@Vlad,正如我上面寫的,這些都不是手動線程,我正在談論ASP.NET自動線程 – SexyMF
那麼,你會發現asp.net是如何工作的,它實際上是處理多個請求的同一個線程。你需要尋找其他東西來記錄。可能會有相關的會話。 –