Hola, descubrimos la respuesta a tu interrogante, desplázate y la encontrarás aquí.
Solución:
Sugeriría usar un middleware simple que inserte en la canalización de ASP .NET Core, para enriquecer LogContext de Serilog con los datos que desea, usando las dependencias que necesita, permitiendo que la inyección de dependencia de ASP .NET Core resuelva las dependencias por usted. .
por ejemplo, suponiendo IUserDataService
es un servicio que puede usar para obtener los datos que necesita, para enriquecer el registro, el middleware se vería así:
public class UserDataLoggingMiddleware
private readonly RequestDelegate _next;
public UserDataLoggingMiddleware(RequestDelegate next)
_next = next;
public async Task Invoke(HttpContext context, IUserDataService userDataService)
var userData = await userDataService.GetAsync();
// Add user data to logging context
using (LogContext.PushProperty("UserData", userData))
await _next.Invoke(context);
LogContext.PushProperty
anterior está haciendo el enriquecimiento, agregando una propiedad llamada UserData
al contexto de registro de la ejecución actual.
ASP .NET Core se encarga de resolver IUserDataService
siempre y cuando lo hayas registrado en tu Startup.ConfigureServices
.
Por supuesto, para que esto funcione, tendrás que:
1. Dígale a Serilog que enriquezca el registro desde el contexto de registro, llamando Enrich.FromLogContext()
. p.ej
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(Configuration)
.Enrich.FromLogContext() // <<======================
.WriteTo.Console(
outputTemplate: "[Timestamp:HH:mm:ss Level:u3] Message:lj " +
"Properties:jNewLineException")
.CreateLogger();
2. Agregue su middleware a la canalización, en su Startup.Configure
. p.ej
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
// ...
app.UseMiddleware();
// ...
app.UseMvc();
Ten en cuenta dar visibilidad a este enunciado si te fue de ayuda.