ASP.NET中的log4net唯一请求ID

时间:2013-04-05 19:48:09

标签: asp.net log4net

log4net 1.2.11.0

我正在尝试获取任何允许我使用每个ASP.NET请求的唯一值进行记录的内容。

我尝试了%thread,但线程似乎被重用了。

我已经尝试了%aspnet-request和%aspnet-session,其中没有任何有意义的内容。

我查看了ThreadContext.Properties和LogicalThreadContext.Properties,但它们中没有任何内容。

任何人都有诀窍来完成这项工作?我需要能够从日志文件中选择特定请求的日志。

4 个答案:

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