Asp.net core asp.net核心中的日志请求ID

Asp.net core asp.net核心中的日志请求ID,asp.net-core,httprequest,Asp.net Core,Httprequest,我管理一个向我心爱的用户显示用户友好错误的服务。如果他们得到一个错误,通常他们会打电话给支持人员并提到RequestId。我使用以下代码获取此请求id: public string RequestId => Activity.Current?.Id ?? HttpContext.TraceIdentifier; 现在有趣的是。。。我们向用户显示id,但不将其保留在日志中: 目前,我们使用此代码将所有日志发送到Cloudwatch public void Configure(IApplic

我管理一个向我心爱的用户显示用户友好错误的服务。如果他们得到一个错误,通常他们会打电话给支持人员并提到RequestId。我使用以下代码获取此请求id:

public string RequestId => Activity.Current?.Id ?? HttpContext.TraceIdentifier;
现在有趣的是。。。我们向用户显示id,但不将其保留在日志中:

目前,我们使用此代码将所有日志发送到Cloudwatch

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
       (...)
       loggerFactory.AddAWSProvider(
            Configuration.GetAWSLoggingConfigSection("Cloudwatch"),
            (l, obj, ex) =>
            {
                var level = "info";
                if (l == LogLevel.Error || l == LogLevel.Critical) level = "error";
                else if (l == LogLevel.Warning) level = "warn";
                return JsonConvert.SerializeObject(new
                {
                    level,
                    msg = ex?.Message ?? obj.ToString(),
                    meta = ex?.ToString()
                });
            });

        (...)
    }
我很难找到一个好的方法将HttpRequest一直发送到这个lambda,这样我就可以一致地记录Id

你会怎么处理

谢谢,, Seb

你能试试吗:

public class Startup
{
    ...
    public void ConfigureServices(IServiceCollection services)
    {
        ...
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
        ...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
        ILoggerFactory loggerFactory, IHttpContextAccessor httpContextAccessor)
    {
        ...

        var httpContext = httpContextAccessor.HttpContext;
        var user = httpContext.User;

        ...
    }
}

让我知道这是否有效,因为我无法设置与您相同的环境,所以在发布之前无法测试代码。

Omg!下星期一我会试试的!有没有HttpContext空,知道吗?