将Serilog与.Enrich.FromLogContext()
一起使用我在管道using LogContext.PushProperty("UserName", user.Name)
问题是,此范围在ExceptionHandling,RequestLogging等中的返回管道上不可用。因此,发生异常时,我缺少重要信息。
管道示例::
RequestLogging --> ExceptionHandling --> Authentication --> Controller |
|
RequestLogging <-- ExceptionHandling <-- Authentication --> Controller |
我尝试使用IDiagnosticContext
,但仅在UseSerilogRequestLogging()
中可用
您能建议如何解决它吗?
在异常处理中间件的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(......)
}
}
}
这样,即使在身份验证中间件之后发生了异常,即使异常中间件在管道中,您也可以访问登录的用户。