2011-10-18 57 views
2

我的所有log4net appender都可以在我的web應用程序中正常工作並正常工作,但是當我啓動一個不同的線程來啓動數據同步過程時,該獨立線程中的所有日誌語句都會進入空白的深淵;沒有我的appender被解僱。任何人都知道爲什麼會這樣?爲什麼Log4Net不在單獨的線程中記錄日誌語句?

private static readonly ILog Log = LogManager.GetLogger("mylog"); 

public static string SomeValue 
{ 
    get 
    { 
    Log.Debug("This WILL be appended to the log"); 

    var thread = new Thread(SyncData); 
    thread.Start(); 

    return "the value"; 
    } 
} 

private static void SyncData() 
{ 
    Log.Debug("This will NOT be appended to log"); 

    var newLog = LogManager.GetLogger("mylog"); 
    newLog.Debug("This will also NOT be appended to the log"); 
} 

回答

3

您應該啓用log4net的內部調試,看看是否是log4net的報告出亂子。

查看「如何啓用log4net內部調試?」部分在this link

+0

這有助於指出解決問題的方法。我的一個appender依賴於'HttpContext.Current',事後認爲完美的是,HttpContext.Current在離開web應用程序線程的新線程中爲NULL。 –

0

當你在產卵ASP.Net應用程序新的一個新的線程將應用程序池的用戶名登錄(新線程具有相同的安全上下文中運行你的web應用程序的過程中,即AppPool)。而當前正在處理您的頁面的webApp線程可能正在使用不同的用戶帳戶運行;您正在模擬的那個或您定義爲在匿名訪問下運行的帳戶。線程IIS之間存在安全差異的原因在於您創建的任何線程爲:

我們有一個應用程序池(在單個帳戶下運行),它可能正在通過單獨的線程處理大量Web請求在不同的帳戶下運行。當你從一個線程內創建一個線程時'。需要父進程的安全性而不是父線程的安全性。

你有兩個選擇,你要麼需要提供額外的權限被設置爲運行應用程序池的用戶帳戶,讓你有寫權限的任何您需要登錄到:

Thread permissions in ASP.NET

或理論上你可以在每個產生的線程上使用模擬,以便它具有與它所源自的線程相同的安全上下文。

http://www.justskins.com/forums/impersonation-in-a-sub-34034.html

+0

我只是試圖快速調試它,看看哪些用戶和安全上下文的兩個線程在運行了。 'VAR用戶= WindowsIdentity.GetCurrent()名稱;'這產生了相同的兩個線程......都是你確定w3wp進程下的所有線程都不一定在同一個用戶下運行? –

+0

我的歉意我發誓我在過去看到過這種行爲,因爲我有類似的問題。也許這隻適用於IIS6 http://msdn.microsoft.com/en-us/library/ms526063(v=vs.90).aspx – JonAlb

+0

我希望你是對的:)但它看起來好像安全上下文兩者都是一樣的。我知道您可以定義要處理應用程序池的進程數量,其中該應用程序僅設置爲一個。也許安全性成爲更多的問題與多個進程處理Web應用程序 –

相關問題