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]; 
    } 
}