Gui*_*ndi 12 dependency-injection .net-core
这与这个问题有关。上下文:.Net Core 3.1,使用Microsoft.Extensions.Logging
记录器是应用程序的IHost. 如果我将 (DI) an 注入ILogger<T>到我的类或方法中,则注入的对象与其他类或方法在请求ILogger<T>. 这就提出了当我在一个线程中使用时会发生什么的问题logger.BeginScope($"Processing {transactionId}")。其他线程会发生什么情况?他们也会改变日志记录范围吗?日志记录范围是否会混淆?如果他们不这样做:那是如何工作的,因为他们的记录器是同一个对象?如果它们混合作用域,我怎样才能使两个线程对给定ILogger<T>类型使用不同的日志记录作用域?
Mat*_*hew 17
这取决于记录器实现,但通常它们是使用AsyncLocal中保存的堆栈类型来实现的。
调用BeginScope会将一个新项目放入该堆栈中,并且相邻的项目Dispose会将其从该堆栈中弹出。
当通过或以其他方式调用记录器时LogInformation,当前堆栈对象的数据将被复制以将其写入控制台或记录器实例配置为执行的任何输出。
这AsyncLocal使得框架能够跨线程和任务存储信息。
作为参考,请查看Microsoft.Extensions.Logging.Console源代码:
| 归档时间: |
|
| 查看次数: |
6557 次 |
| 最近记录: |