log4net 1.2.11.0
我正在尝试获取任何可以让我为每个 ASP.NET 请求使用唯一值进行记录的东西。
我尝试了 %thread,但线程似乎被重用了。
我试过 %aspnet-request 和 %aspnet-session ,它们没有任何意义。
我查看了 ThreadContext.Properties 和 LogicalThreadContext.Properties,但它们也没有任何内容。
有没有人有诀窍来完成这件事?我需要能够从日志文件中挑选特定请求的日志。
.asmx
文件仍将调用Application_BeginRequest
事件,您可以在其中存储唯一的 GUID HttpContext.Current.Items
(使用此集合可避免请求处理跳转线程时出现的奇怪问题)。仅当您使用 WCF(并且还取决于配置)时,这才行不通。
如果您不想接触应用程序本身,您可以使用HttpContext.Current.Timestamp
它返回请求处理开始的时间。将其与您现有的获取线程 ID 的方法相结合,您将获得一个独特的价值。
HttpContext.Current.Items
- 是个好主意。
尝试添加类似的东西:
HttpContext.Current.Items.Add("RequestIdentity", Guid.NewGuid().ToString())
在 .NET Core 中,您可以通过这种方式(从您的控制器)访问它,也可以从其他任何地方HttpContext.Items
使用它。HttpContextAccessor
所有细节都在这里。
clock tick
我认为,当您的请求开始时存储的+ process ID
+thread ID
应该足够了(假设每个线程一次处理 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];
}
}