log4net 1.2.11.0
我正在尝试获取任何允许我使用每个ASP.NET请求的唯一值进行记录的内容。
我尝试了%thread,但线程似乎被重用了。
我已经尝试了%aspnet-request和%aspnet-session,其中没有任何有意义的内容。
我查看了ThreadContext.Properties和LogicalThreadContext.Properties,但它们中没有任何内容。
任何人都有诀窍来完成这项工作?我需要能够从日志文件中选择特定请求的日志。
答案 0 :(得分:22)
.asmx
文件仍会调用Application_BeginRequest
事件,您可以在HttpContext.Current.Items
中存储唯一的GUID(使用此集合可避免在请求处理跳转线程时出现奇怪的问题)。只有当你使用WCF(然后它依赖于配置)时才会有效。
如果您不想触摸应用程序本身,可以使用HttpContext.Current.Timestamp
返回请求处理开始的时间。加上您现有的获取线程ID的方法,您将获得一个独特的价值。
答案 1 :(得分:8)
HttpContext.Current.Items
- 是个好主意。
尝试添加类似的内容:
HttpContext.Current.Items.Add("RequestIdentity", Guid.NewGuid().ToString())
答案 2 :(得分:5)
clock tick
+ process ID
+ thread ID
就足够了(假设每个线程一次处理1个请求)。
答案 3 :(得分: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];
}
}