gpt4 book ai didi

.net - log4net.ThreadContext 和 log4net.LogicalThreadContext 有什么区别?

转载 作者:行者123 更新时间:2023-12-02 16:20:05 27 4
gpt4 key购买 nike

2014 年 11 月 18 日更新 - 在浏览 log4net 源存储库时,我发现 LogicalThreadContext 的实现在 2011 年 11 月被修改为它使用 CallContext.LogicalSetData 存储其属性(并使用 LogicalGetData 获取它们)。这很重要,因为这意味着 LogicalThreadContext 现在应该可以正常工作。存储在 LogicalThreadContext 中的任何数据都应该“流动”到任何子线程或任务。这与 ThreadContext(以及 LogicalThreadContext 的旧实现)相比,其中存储在上下文中的数据将保留在当前线程的本地,而不是流向子线程/任务。

如果你有兴趣,这里是变化:

http://svn.apache.org/viewvc/logging/log4net/trunk/src/log4net/Util/LogicalThreadContextProperties.cs?r1=1165341&r2=1207948&diff_format=h

希望遇到这个老问题的人会发现这些信息很有用。

log4net 提供了两个不同的“线程上下文”对象:ThreadContextLogicalThreadContext ,每个都有一个属性包,Properties。 ThreadContext 有一个 ThreadContextProperties包,而 LogicalThreadContext 有一个 LogicalThreadContextProperties包。

ThreadContext 可能更常被称为“MDC”。
LogicalContext 可能更常被称为“LDC”。
我将在本文的其余部分使用简称。

MDC.Properties 使用 System.Threading.Thread.SetData 实现而 LDC.Properties 是使用 System.Runtime.Remoting.Messaging.CallContext.SetData 实现的.

为了比较,NLog 只公开“MDC”(现在称为 MappedDiagnosticContext)来存储线程本地属性。 NLog的实现使用System.Threading.Thread.SetData,所以它的实现和log4net的一样。

在 log4net 和 NLog 中,“MDC”属性存储在字典中,字典本身存储在线程本地存储中。

在这种情况下,将字典存储在用 [ThreadStatic] 修饰的类成员变量中是否等效?

[ThreadStatic]
private static IDictionary<string, string> threadProperties;

使用 .NET 4.0 的新 ThreadLocal 类的等效(或类似)声明是什么?

归根结底,LDC 和 MDC 之间真正、实用的区别是什么?即使阅读了上面链接的 MSDN 主题,我也不清楚。你什么时候会真正使用一个?我看到的关于 log4net 和上下文的绝大多数引用资料/示例似乎都是针对 GDC(全局 - 我理解)、NDC(嵌套 - 我也理解)和 MDC。我在谷歌搜索时可以找到的对 LDC(或 LogicalThreadContext)的大部分引用都与 checkin log4net 源代码存储库有关,而不是实际使用。 LDC 几乎从不出现在问题或例子中。

我确实找到了 this链接提供了一些关于与 log4net 开发人员之一 Nicko Cadell 之间差异的非常好的信息,但我仍然不清楚。

一个与 log4net 没有直接关系的更大的问题是 Thread.SetData 和 CallContext.SetData 之间的实际区别是什么?

根据 CallContext MSDN 文章中,CallContext 数据可以传播到另一个 AppDomain。要传播,存储在 CallContext 中的数据项必须公开 ILogicalThreadAffinative界面。所以,这似乎是 Thread.SetData 和 CallContext 之间的一个区别。

根据 Nicko Cadell 链接,log4net 没有实现 ILogicalThreadAffinative,因此不会传播 LDC 属性。

也许这里有足够的内容,我应该能够回答我自己的问题,也许没有。我还在努力理解。

如果您使用 log4net,您是否都使用 MDC、LDC,两者都使用?如果您使用 MDC,是不是因为大多数“现实世界”示例似乎都使用它?如果您使用LDC,您有使用它的具体原因吗?如果两者都使用,您如何选择何时使用哪个?

请注意,我看过一些关于 MDC(可能还有 LDC)的文章,可能由于线程切换而无法在 ASP.net 应用程序中正常工作。我对这个问题不是特别感兴趣,因为我不在 ASP.net 中工作。

实际上,我在 SO 上找到了一些可能有助于讨论的有用帖子:

What are best practices for using thread local storage in .NET?

.Net: Logical thread and Thread Local Storage?

提前致谢!

最佳答案

警告:这是猜测。

假设您正在编写一个服务器,并且为请求提供服务意味着您必须与一堆不同的服务进行对话。作为一个完全现代的开发人员,您异步地发出这些请求,协调一切响应(或超时)以响应原始请求。

这意味着与单个请求对应的工作分散在许多不同的线程中(异步处理 Web 服务响应)。我怀疑 CallContext用于将“我所做的一切都是因为这个传入请求”传播到不同的线程,以便您可以一起收集该请求的所有日志。 ThreadContext不会有帮助。请注意,我假设所有工作都在单个 AppDomain 中执行,因此您担心不会有问题。

关于.net - log4net.ThreadContext 和 log4net.LogicalThreadContext 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3841075/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com