请考虑以下代码:
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。
我可以在输出模板中使用什么来为此特定执行运行使用相同的标识符?
您需要自己发明并应用标识符,例如: OperationId
:
// .Enrich.FromLogContext(), then
using (LogContext.PushProperty("OperationId", 123))
{
// Your async code here
}
如果代码字面上如上所述并且您可以传递logger
,则可以根据Nick的答案跳过正常的LogContext
/ Enrich.FromLogContext
并在其上下文中添加上下文属性,即
var opLogger = logger.ForContext("OperationId",123);
然后使用opLogger
来标记消息 - 然后使用{OperationId}
特定属性,或者使用catch-all {Properties}
元标记(这意味着“其他地方没有特别提到的所有属性”)在渲染时在消息模板中发出值。