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