在管道中后期建立的Serilog上下文在返回管道上无法早期使用

问题描述 投票:1回答:1

将Serilog与.Enrich.FromLogContext()一起使用我在管道using LogContext.PushProperty("UserName", user.Name)

的后期添加“登录用户”作为作用域

问题是,此范围在ExceptionHandling,RequestLogging等中的返回管道上不可用。因此,发生异常时,我缺少重要信息。

管道示例::

RequestLogging --> ExceptionHandling --> Authentication --> Controller |
                                                                       |
RequestLogging <-- ExceptionHandling <-- Authentication --> Controller |

我尝试使用IDiagnosticContext,但仅在UseSerilogRequestLogging()中可用

您能建议如何解决它吗?

c# logging .net-core serilog .net-core-3.1
1个回答
0
投票

在异常处理中间件的Invoke方法中,您将当前的HttpContext作为参数。知道这一点,您可以访问上下文的标识属性。

public async Task Invoke(HttpContext context)
{
  try
  {
    await this.next(context);
  }
  catch (Exception e)
  {
    var username = context.User?.Identity?.Name ?? "__unknown";
    using (LogContext.PushProperty("Username", username))
    {
     this.logger.Log(......)
    }
  }
}

这样,即使在身份验证中间件之后发生了异常,即使异常中间件在管道中,您也可以访问登录的用户。

© www.soinside.com 2019 - 2024. All rights reserved.