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