2012-08-01 62 views
1

我想弄清楚如何使用ThreadContext.Properties設置每個用戶會話。log4net GlobalContext

當用戶在網站上登錄時,用戶標識存儲在會話中。這個值 然後我想在成功登錄後追加到ThreadContext.Properties [「UserID」]。

我使用adonetappender將日誌條目保存到數據庫,並使用%property {userid}來檢索值。但有時這個值讀取爲空。

所以基本上我想要的是:

1),我想登錄這些網頁創建

private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

2)成功登錄後,我需要在ThreadContext.Properties [「UserID」]中存儲一個始終存在於整個用戶會話中的值,並且可以從我登錄的頁面以及Application_Error 。)在global_asax中。無論如何,這個ThreadContext的使用壽命是多少?就我所知,我無法真正使用GlobalContext。

3)我不想重新分配每個日誌語句的值。

希望你能明白我要去的地方。

//丹尼爾

回答

0

見我的答案在這裏:

Capture username with log4net

的一些想法,可以幫助你。一直讀到最後,因爲最後的想法可能是最簡單的,可能會滿足您的需求。總結起來,我首先提出了一個自定義的PatternLayoutConverter,HttpContextPatternLayoutConverter,它允許日誌值存儲在一個HttpContext中。

在我的回答結束時,我提出了一個基於另一篇博客文章的解決方案(鏈接在我的原始答案中),它顯示瞭如何編寫一個可存儲在GlobalDiagnosticContext(或ThreadDiagnosticContext中)的類。當您告訴log4net記錄該GlobalDiagnosticContext參數時,log4net將訪問該對象並調用其ToString方法。對象本身只是從HttpContext中提取一個值。

因此,如果您能夠使用HttpContext存儲您想要記錄的信息,那麼我的鏈接答案可能對您有用。如果你不能使用HttpContext來存儲信息,那麼我的答案可能是沒用的。

祝你好運!

+0

非常感謝!偉大的提示!最後,在閱讀您的想法之前,圍繞log4net實現一個非常簡單的包裝。 這只是爲了簡化每次我必須記錄的東西時的語句。 Logger.LogEntry(ILog,Message,Exception,Level [DEBUG | ERROR | WARNING | INFO],...);這是僞類似的: Logger.LogEntry 而LogEntry總是從會話中讀取並設置ThreadContext變量。 它似乎符合我的需求:) 但現在我已經學到了更多的東西,並應嘗試實施您的想法,看看我能否從中受益更多。 // Daniel – 2012-08-17 18:37:55