26

log4net 1.2.11.0

我正在尝试获取任何可以让我为每个 ASP.NET 请求使用唯一值进行记录的东西。

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

我试过 %aspnet-request 和 %aspnet-session ,它们没有任何意义。

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

有没有人有诀窍来完成这件事?我需要能够从日志文件中挑选特定请求的日志。

4

4 回答 4

23

.asmx文件仍将调用Application_BeginRequest事件,您可以在其中存储唯一的 GUID HttpContext.Current.Items(使用此集合可避免请求处理跳转线程时出现的奇怪问题)。仅当您使用 WCF(并且还取决于配置)时,这才行不通。

如果您不想接触应用程序本身,您可以使用HttpContext.Current.Timestamp它返回请求处理开始的时间。将其与您现有的获取线程 ID 的方法相结合,您将获得一个独特的价值。

于 2013-04-15T15:36:26.210 回答
10

HttpContext.Current.Items- 是个好主意。

尝试添加类似的东西:

HttpContext.Current.Items.Add("RequestIdentity", Guid.NewGuid().ToString())

在 .NET Core 中,您可以通过这种方式(从您的控制器)访问它,也可以从其他任何地方HttpContext.Items使用它。HttpContextAccessor

所有细节都在这里

于 2013-04-19T09:21:31.690 回答
6

clock tick我认为,当您的请求开始时存储的+ process ID+thread ID应该足够了(假设每个线程一次处理 1 个请求)。

于 2013-04-19T18:07:58.483 回答
2

这是我为此目的创建的一些扩展方法:

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];
    }
}
于 2015-11-22T15:05:21.223 回答