Как сохранить непротиворечивый идентификатор в асинхронном методе с Serilog - PullRequest
2 голосов
/ 25 апреля 2019

Рассмотрим следующий код:

public async Task DoStuff() {
  ILogger logger = LoggerFactory.CreateLogger<PuppetFactory>();
  logger.LogDebug("1");
  await Something()
  logger.LogDebug("2");
  await SomethingElse()
  logger.LogDebug("3");
}  

В outputTemplate для Serilog у меня есть {ThreadId}. Конечно, поскольку async / await перебрасывает выполнение кода из потока в поток, мой журнал показывает разные идентификаторы потока.

Что я могу использовать в моем шаблоне вывода, чтобы иметь такой же идентификатор для этого конкретного запуска выполнения?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Вам нужно будет придумать и применить идентификатор самостоятельно, например, OperationId

// .Enrich.FromLogContext(), then
using (LogContext.PushProperty("OperationId", 123))
{
    // Your async code here
}
1 голос
/ 26 апреля 2019

Если код буквально такой же, как указано выше, и вы можете передать logger, вы можете пропустить нормальный LogContext / Enrich.FromLogContext согласно ответу Ника и добавить контекстное свойство в его контекст, то есть

var opLogger = logger.ForContext("OperationId",123);

затем используйте opLogger, где вы хотите, чтобы сообщения были помечены - затем либо используйте {OperationId} определенное свойство, либо мета-токен catch-all {Properties} (что означает "все свойства, специально не упомянутые в другом месте") для генерации значение в вашем шаблоне сообщения при рендеринге.

...