2011-09-25 80 views
2

我需要將實際的用戶線程ID寫入日誌文件。如果我使用Thread.CurrentThread.ManagedThreadId,我沒有得到唯一的ID,但一次又一次地得到相同的ID。獲取唯一的線程ID

的原因是跟蹤log.Info橫跨整個系統的用戶,以後如果我看到一個問題,我就可以在日誌中WHERE threadId = ?進行搜索,並從記錄整個活動流程。

我不介意讓它在log4net的代碼裏面。

我說的是服務器線程而不是手動線程。

+0

'ManagedThreadId'是爲了在託管線程中唯一。你確定你沒有使用線程池中的可重用線程嗎? – Vlad

+0

@Vlad,正如我上面寫的,這些都不是手動線程,我正在談論ASP.NET自動線程 – SexyMF

+3

那麼,你會發現asp.net是如何工作的,它實際上是處理多個請求的同一個線程。你需要尋找其他東西來記錄。可能會有相關的會話。 –

回答

4

這是不可能的,因爲您的ASP.NET/IIS中的線程正在IIS的線程池上運行......它甚至不能保證HTTP請求在同一線程上完全運行(例如,如果有一些I/O操作,它可以「去睡覺」並被重新分配給池中的另一個線程)...

目標是什麼?也許有一些其他的方式來實現這一目標?

編輯 - 按評論:

要跟蹤你可以嘗試登錄該請求的哈希碼(通過GetHashCode()訪問)和請求/或者記錄http請求對象的一些屬性/字段的值的組合的哈希...

如果你深入挖掘,你可以得到一個工作請求對象,它有一個(請求特定的) TraceID財產...

如果您想跟蹤完全取決於您的會話管理的會話(無論是隱藏的HTML表單字段和/或cookie和/或用戶和/或其他東西)。

+0

嗨,再次閱讀我的文章「原因是......」這是目標。謝謝 – SexyMF

+0

嗨 - 這對我來說不是很清楚,你想跟蹤一個http請求還是整個會話? – Yahia

+0

如果你可以提供一個如何得到它的例子,如果不是,那麼你可以做什麼,謝謝 – SexyMF

3

你原來的假設是不準確的:「實際的線程」被重複使用,這就是爲什麼你一次又一次得到相同的線程ID。

你的錯誤是假定每個請求都將由一個單獨的線程處理。 ManagedThreadId工作正常。

現在讓我們來看看你想要做什麼:

的原因是爲了跨越

所以你要跟蹤與交互系統跟蹤log.Info用戶用戶。不是線程,用戶。同一個用戶可能在多個線程上有交互,並且多個用戶可能使用相同的線程...所以你想要記錄的是用戶ID,而不是線程ID。

+0

謝謝,那麼明白我的假設是什麼問題,我如何跟蹤HTTP請求或會話?謝謝 – SexyMF

+0

@SexyMF:爲什麼不記錄用戶ID?請注意,即使在單個請求中,線程敏捷性也意味着可以在不同的線程上處理同一請求的不同位。 –

+0

我寫了 - ASP.NET – SexyMF