.net core 自从伊洛格<;T>;是单线程,不同的线程如何使用BeginScope()而不影响其他线程?

.net core 自从伊洛格<;T>;是单线程,不同的线程如何使用BeginScope()而不影响其他线程?,.net-core,dependency-injection,.net Core,Dependency Injection,这是有关的。上下文:.Net Core 3.1,使用Microsoft.Extensions.Logging 记录器是应用程序的IHost中的单例记录器。如果我在类或方法中注入(DI)一个ILogger,则注入的对象与其他类或方法请求ILogger时接收的实例相同。这就提出了在一个线程中使用logger.BeginScope($“Processing{transactionId}”)时会发生什么的问题。其他线程会发生什么情况?他们是否也更改了日志记录范围?日志作用域是否混淆了?如果他们没有:如果

这是有关的。上下文:.Net Core 3.1,使用
Microsoft.Extensions.Logging


记录器是应用程序的
IHost
中的单例记录器。如果我在类或方法中注入(DI)一个
ILogger
,则注入的对象与其他类或方法请求
ILogger
时接收的实例相同。这就提出了在一个线程中使用
logger.BeginScope($“Processing{transactionId}”)
时会发生什么的问题。其他线程会发生什么情况?他们是否也更改了日志记录范围?日志作用域是否混淆了?如果他们没有:如果他们的伐木工人是同一个物体,那是怎么回事?如果它们确实混合作用域,如何使两个线程对给定的
ILogger
类型使用不同的日志作用域?

这取决于日志程序的实现,但通常它们是使用一个线程中保存的堆栈类型来实现的

调用
BeginScope
会将一个新项目放入该堆栈,相邻的
Dispose
会将其从该堆栈中弹出

当通过
LogInformation
或其他方式调用记录器时,将复制当前堆栈对象的数据以将其写入控制台或记录器实例配置为执行的任何输出

AsyncLocal
使框架能够跨线程和任务存储信息

有关参考,请查看
Microsoft.Extensions.Logging.Console
源代码:


谢谢!我不知道
AsyncLocal
类型。这种设计的唯一问题是,如果任务需要干净的日志记录上下文,则无法获得干净的日志记录上下文。或者他们可以吗?我认为这就是设计的目的,您希望获得调用方法的代码的上下文信息。如果您不想要一个“干净”的上下文,那么我认为这违背了预期的设计;已启动的任务与启动类无关,但启动类的日志上下文/作用域会传输到已启动的任务,这会污染它们的日志@如果您想启动后台任务,那么我通常建议您不要简单地启动它们,而是考虑将它们排队,这样就可以控制并行执行的数量(以保持线程池处于检查状态)。例如,您可以使用。因为执行是从一个托管服务运行的,所以你也可以从一个干净的日志作用域开始。非常感谢。