2015-11-11 84 views
0

我將log4Net ADONetAppender設置爲一個名爲log的表。log4net%屬性在設置後變爲空

在Global.asax.cs文件的Application_Start()上配置log4net。

表和它的刀片是典型

INSERT INTO log ([PCDate],[Thread],[Level],[Logger],[Message],[Exception]) 
    VALUES (@log_date, @thread, @log_level, @logger, @message, @exception) 

所有所不同的是,我已經把我的記錄器是當前登錄到系統中的應用程序用戶。

這在.config文件中。

<parameter> 
    <parameterName value="@logger"/> 
    <dbType value="String"/> 
    <size value="255"/> 
    <layout type="log4net.Layout.PatternLayout"> 
    <conversionPattern value="%property{userName}"/> 
    </layout> 
</parameter> 

我在負責處理該類的用戶數據記錄的任何插入,更新或刪除之前執行日誌記錄。

logger.Info(strquery); 

記錄器的消息是插入/更新或刪除查詢。 記錄器被設置爲當前應用程序記錄的用戶,例如鮑勃,灰等 在登錄和調試驗證,它被設置爲該值。

log4net.ThreadContext.Properties["userName"] = userName; 

我也可以把上面的語句在每個ASP,最終會做插入/添加/刪除,但將是十分繁瑣,我們看12當前文件更何況,這是無法形成規模,能。

何處/爲什麼屬性值設置爲null後?
表中的記錄是這樣的

enter image description here

回答

0

發生這種情況,因爲ThreadContext堅持當前線程上的用戶名,並且你可以從你的日誌中看到調用之間的線程的變化:當您設置登錄時的值,它對當前請求有效,但下一個請求將獲得一個新線程,並因此產生一個新的ThreadContext,並且該值已消失。

如果您在會話中存儲用戶名,則可以在Global.asax.cs文件中的Application_AcquireRequestState事件中設置ThreadContext屬性。那麼它將對整個請求有效。

+0

偉大的一點。但是,只有在login.aspx頁面上單擊登錄按鈕後,纔會設置該用戶名。我還不知道application_beginRequest的價值。或者我需要通過將它保存在會話中並在BeginREquest中檢查它來檢查它嗎? – devsahem

+0

斯圖爾特,我用了GlobalContext。記錄器的值持續不爲空:) :)但是,我不確定是否全局跨所有用戶? [鏈接](https://logging.apache.org/log4net/release/manual/contexts.html)該鏈接描述了跨AppDomain(我不明白)如何使用globalcontext。這是否意味着它會影響其他用戶,並且每個最近記錄的用戶都會覆蓋此值?我需要另一臺機器來測試它。 – devsahem

+0

是的,GlobalContext將只保存一個值,即最後一個登錄用戶的值。您之前在會話中保留用戶名並使用它填充ThreadContext的想法仍然有效。 – stuartd