Контекст Serilog, настроенный поздно в конвейере, недоступен рано на обратном канале - PullRequest
1 голос
/ 23 января 2020

Использование Serilog с .Enrich.FromLogContext() Я добавляю зарегистрированного пользователя как область видимости в конце конвейера using LogContext.PushProperty("UserName", user.Name)

Проблема в том, что эта область недоступна в обратном конвейере, как в ExceptionHandling, RequestLogging et c .. Поэтому я пропускаю важную информацию при возникновении исключения.

Пример конвейера ::

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

Я пробовал с IDiagnosticContext, но он доступен только в UseSerilogRequestLogging()

Не могли бы вы дать совет, как обойти это?

1 Ответ

0 голосов
/ 25 января 2020

В вашем 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(......)
    }
  }
}

Таким образом, у вас будет доступ к зарегистрированному пользователю, даже если промежуточное программное обеспечение исключения будет первым в конвейере, если исключение произошло после промежуточное программное обеспечение для аутентификации.


РЕДАКТИРОВАТЬ 02/10/2020

Если вам нужна идентификационная информация в .UseSerilogRequestLogging(), вы можете использовать опции перегрузки, которые принимают опции. Проверьте последний пример в Регистрация запросов на их странице github.

...