【问题标题】:log4net unique request id in ASP.NETASP.NET 中的 log4net 唯一请求 ID
【发布时间】:2020-06-25 02:13:08
【问题描述】:

log4net 1.2.11.0

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

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

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

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

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

【问题讨论】:

  • 这没有帮助。我希望有效的一种方法是有一个线程互锁计数器,我用它来设置每个请求的线程名称,%thread 似乎可以正确输出。这是一个巨大的假设,即我的请求在单个线程上端到端运行。
  • 更糟糕的是,由于事情在线程池上运行,您只能设置线程名称一次! (奇怪的是,这似乎适用于 .Net 而在 Mono 上失败)
  • 您可以实现一个 httpmodule,它拦截每个请求并向上下文添加一个 guid,然后该请求中的所有日志都将使用相同的唯一 ID 记录。
  • 实际上是的,但我使用的是 .asmx SOAP 服务,我认为我能做到这一点的唯一地方是通过 SoapExtension。

标签: asp.net log4net


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    尝试添加类似的东西:

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

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

    所有细节here。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          • 2014-10-08
          • 1970-01-01
          • 2016-08-20
          • 1970-01-01
          相关资源
          最近更新 更多