2013-04-05 89 views
23

log4net的1.2.11.0log4net的唯一請求ID

我試圖得到什麼,讓我登錄爲每個ASP.NET請求的唯一值。

我試過%線程,但線程似乎被重用。

我試過%aspnet-request和%aspnet-session沒有任何有意義的內容。

我看了一下ThreadContext.Properties和LogicalThreadContext.Properties,但是他們也沒有任何東西。

任何人都有一個把戲來完成這件事?我需要能夠從日誌文件中選擇特定請求的日誌。

+2

的Guid,新鮮的。 – 2013-04-05 20:05:08

+0

這沒有幫助。我希望能夠使用的方法是使用線程互鎖計數器,並使用它來設置每個請求上的線程名稱,並且%線程似乎正確輸出。這是一個巨大的假設,我的請求在單個線程上端到端運行。 – LiteWait 2013-04-06 13:57:18

+0

因爲事情在線程池上運行,所以只能設置一次線程名稱! (奇怪的是,這似乎在.Net上工作,並在單聲道上失敗) – LiteWait 2013-04-06 14:27:06

回答

5

clock tick + process ID + thread ID作爲存儲時,你的要求開始應該是足夠的,我認爲(假設每個線程處理每次1個請求)。

22

.asmx文件仍然會調用Application_BeginRequest事件,您可以在HttpContext.Current.Items中存儲唯一的GUID(使用此集合避免請求處理跳過線程時出現的奇怪問題)。只有當你使用WCF(也取決於配置),這是行不通的。

如果您不想觸摸應用程序本身,則可以使用HttpContext.Current.Timestamp返回開始請求處理的時間。加入現有的獲取線程ID的方法,您將獲得唯一的值。

7

HttpContext.Current.Items - 是個好主意。

嘗試添加類似的東西:

HttpContext.Current.Items.Add("RequestIdentity", Guid.NewGuid().ToString()) 
1

下面是我爲這個目的而創建的一些推廣方法:

public static Guid GetId(this HttpContext ctx) => new HttpContextWrapper(ctx).GetId(); 

public static Guid GetId(this HttpContextBase ctx) 
{ 
    const string key = "tq8OuyxHpDgkRg54klfpqg== (Request Id Key)"; 

    if (ctx.Items.Contains(key)) 
     return (Guid) ctx.Items[key]; 

    var mutex = string.Intern($"{key}:{ctx.GetHashCode()}"); 
    lock (mutex) 
    { 
     if (!ctx.Items.Contains(key)) 
      ctx.Items[key] = Guid.NewGuid(); 

     return (Guid) ctx.Items[key]; 
    } 
}