log4net的1.2.11.0log4net的唯一請求ID
我試圖得到什麼,讓我登錄爲每個ASP.NET請求的唯一值。
我試過%線程,但線程似乎被重用。
我試過%aspnet-request和%aspnet-session沒有任何有意義的內容。
我看了一下ThreadContext.Properties和LogicalThreadContext.Properties,但是他們也沒有任何東西。
任何人都有一個把戲來完成這件事?我需要能夠從日誌文件中選擇特定請求的日誌。
log4net的1.2.11.0log4net的唯一請求ID
我試圖得到什麼,讓我登錄爲每個ASP.NET請求的唯一值。
我試過%線程,但線程似乎被重用。
我試過%aspnet-request和%aspnet-session沒有任何有意義的內容。
我看了一下ThreadContext.Properties和LogicalThreadContext.Properties,但是他們也沒有任何東西。
任何人都有一個把戲來完成這件事?我需要能夠從日誌文件中選擇特定請求的日誌。
clock tick
+ process ID
+ thread ID
作爲存儲時,你的要求開始應該是足夠的,我認爲(假設每個線程處理每次1個請求)。
.asmx
文件仍然會調用Application_BeginRequest
事件,您可以在HttpContext.Current.Items
中存儲唯一的GUID(使用此集合避免請求處理跳過線程時出現的奇怪問題)。只有當你使用WCF(也取決於配置),這是行不通的。
如果您不想觸摸應用程序本身,則可以使用HttpContext.Current.Timestamp
返回開始請求處理的時間。加入現有的獲取線程ID的方法,您將獲得唯一的值。
HttpContext.Current.Items
- 是個好主意。
嘗試添加類似的東西:
HttpContext.Current.Items.Add("RequestIdentity", Guid.NewGuid().ToString())
下面是我爲這個目的而創建的一些推廣方法:
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];
}
}
的Guid,新鮮的。 – 2013-04-05 20:05:08
這沒有幫助。我希望能夠使用的方法是使用線程互鎖計數器,並使用它來設置每個請求上的線程名稱,並且%線程似乎正確輸出。這是一個巨大的假設,我的請求在單個線程上端到端運行。 – LiteWait 2013-04-06 13:57:18
因爲事情在線程池上運行,所以只能設置一次線程名稱! (奇怪的是,這似乎在.Net上工作,並在單聲道上失敗) – LiteWait 2013-04-06 14:27:06