Asp.net core mvc Serilog:为每个请求创建并跟踪唯一的日志上下文?

Asp.net core mvc Serilog:为每个请求创建并跟踪唯一的日志上下文?,asp.net-core-mvc,serilog,Asp.net Core Mvc,Serilog,如何在ASP.NET核心MVC应用程序中为每个请求保留唯一的日志上下文 我一直在寻找一段时间我可以如何做到这一点。我只能假设我遗漏了一些明显的东西 基本上,例如,假设我有一个端点,它接受一些有效负载。然后,它将属性推送到日志上下文以丰富日志(从有效负载或在处理请求时从存储库检索,等等) 我要确保的是,如果我有多个异步HTTP请求,那么上下文对于该请求是唯一的,并且在请求处理完成时会被丢弃,这样事情就不会混淆 有没有办法做到这一点?已经考虑过了吗?我正在Main方法中设置Serilog,并将其添加

如何在ASP.NET核心MVC应用程序中为每个请求保留唯一的日志上下文

我一直在寻找一段时间我可以如何做到这一点。我只能假设我遗漏了一些明显的东西

基本上,例如,假设我有一个端点,它接受一些有效负载。然后,它将属性推送到日志上下文以丰富日志(从有效负载或在处理请求时从存储库检索,等等)

我要确保的是,如果我有多个异步HTTP请求,那么上下文对于该请求是唯一的,并且在请求处理完成时会被丢弃,这样事情就不会混淆

有没有办法做到这一点?已经考虑过了吗?我正在
Main
方法中设置Serilog,并将其添加到WebHostBuilder中。我想我需要做一些DI,但我不想在MVC应用程序完全启动之前丢失输出的日志

编辑:当前的设置方式

public static void Main(string[] args)
{
    Log.Logger = new LoggerConfiguration()
        .ReadFrom.Configuration(Configuration)
        .CreateLogger();

     try
     {
        Log.Information("Starting web host...");
        BuildWebHost(args).Run();
     }
     catch (Exception ex)
     {
        Log.Fatal(ex, "Host terminated unexpectedly");
     }
     finally
     {
        Log.CloseAndFlush();
     }
 }

 private static IWebHost BuildWebHost(string[] args) =>
     WebHost.CreateDefaultBuilder(args)
         .UseSerilog()
         .UseKestrel()
         .UseUrls("http://*:5000")
         .UseStartup<Startup>()
         .Build();
publicstaticvoidmain(字符串[]args)
{
Logger.Logger=新的LoggerConfiguration()
.ReadFrom.Configuration(配置)
.CreateLogger();
尝试
{
日志信息(“正在启动web主机…”);
BuildWebHost(args.Run();
}
捕获(例外情况除外)
{
Log.Fatal(例如,“主机意外终止”);
}
最后
{
Log.CloseAndFlush();
}
}
私有静态IWebHost BuildWebHost(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.useserlog()
.UseKestrel()
.useURL(“http://*:5000”)
.UseStartup()
.Build();

我在我的一个项目中使用中间件实现此功能:

using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

public class LoggingEnrichmentMiddleware
{
    private readonly ILogger<LoggingEnrichmentMiddleware> _logger;

    private readonly RequestDelegate _next;

    public LoggingEnrichmentMiddleware(
        RequestDelegate next,
        ILogger<LoggingEnrichmentMiddleware> logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task Invoke(HttpContext context)
    {
        using (_logger.BeginScope(
            "{Method} {Path} {Query} {RemoteIp} {LocalIp}",
            context.Request.Method,
            context.Request.Path,
            context.Request.QueryString,
            context.Connection.RemoteIpAddress,
            context.Connection.LocalIpAddress))
        {
            await _next(context);
        }
    }
}

你能发布你当前的代码来告诉我们你在配置Serilog方面取得了多大进展吗?我在Main/builder中添加了初始化Serilog的方法我想我需要添加一个DI配置来从globa日志“每个请求”创建一个新的上下文,但我不知道你需要确保添加以下内容:Enrich.FromLogContext()在ReadFrom.Configuration行之后。以下是我配置的(可能有不同的软件包)Log.Logger=new LoggerConfiguration().ReadFrom.Configuration(Configuration).rich.FromLogContext().rich.WithDemystifiedStackTraces().rich.WithMachineName().CreateLogger();appsettings中我的outputTemplate如下:“outputTemplate”:“[{Timestamp:HH:mm:ss}{Level:u3}]-{RequestId}-{MachineName}-{Message:lj}{NewLine}{Exception}”@Emma Middlebrook-对我不起作用,RequestId始终为空。
app.UseMiddleware<LoggingEnrichmentMiddleware>();