如何使用Serilog在异步方法上保持一致的标识符

时间:2019-04-25 16:42:42

标签: c# logging .net-core serilog

考虑以下代码:

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

在Serilog的outputTemplate中,我有{ThreadId}。当然,由于async / await在线程之间引发代码执行,因此我的日志显示了不同的线程ID。

我可以在输出模板中使用什么以使该特定执行运行具有相同的标识符?

2 个答案:

答案 0 :(得分:2)

您需要自己发明和应用标识符,例如OperationId

// .Enrich.FromLogContext(), then
using (LogContext.PushProperty("OperationId", 123))
{
    // Your async code here
}

答案 1 :(得分:1)

如果代码如上,并且您可以传递logger,则可以按照Nick的回答跳过常规的LogContext / Enrich.FromLogContext并将上下文属性添加到上下文中,即

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

然后在要标记邮件的地方使用opLogger-然后使用{OperationId}的特定属性或全部{Properties}的元令牌(这意味着“所有属性都不是特定的呈现时会在消息模板中发出值。