Ваш обогащатель недействителен.Вы смешиваете две концепции.Добавление свойства в контекст журнала - это не то же самое, что создание фактического обогащения.Фактический обогащатель должен реализовывать ILogEventEnricher, как показано в в этом примере .
То, что вы на самом деле создали, - это промежуточное ПО ASP.NET.LogContext.PushProprety возвращает IDisposable и должен быть заключен в оператор using, а затем все, что находится внутри блока using, должно иметь контекст журнала с дополнительным свойством.Как показано в документации .
Один из способов исправить это - удалить LogUserName
из конфигурации вашего обогащения.Затем измените промежуточное программное обеспечение на следующее:
public class LogUserNameMiddleware
{
private readonly RequestDelegate next;
public LogUserNameMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task InvokeAsync(HttpContext context)
{
using(LogContext.PushProperty("UserName", context.User.Identity.Name))
{
await next(context);
}
}
}
Обратите внимание, что вам нужно сообщить ASP.NET Core о промежуточном программном обеспечении, если вы еще этого не сделали.
public static class LogUserNameMiddlewareExtensions
{
public static IApplicationBuilder UseLogUserNameMiddleware(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<LogUserNameMiddleware>();
}
}
и вметод Startup.Configure, вы можете добавить промежуточное ПО в свой конвейер:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseLogUserNameMiddleware();
//your other middleware
}
}
Обратите внимание, что вы можете очистить ваше промежуточное ПО для обработки, если нет вошедшего в систему пользователя, поэтому вы неполучить исключение NullReferenceException.