代码之家  ›  专栏  ›  技术社区  ›  wageoghe

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

  •  28
  • wageoghe  · 技术社区  · 14 年前

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

    希望有人会发现这个老问题有用。

    log4net提供了两个不同的“线程上下文”对象: ThreadContext LogicalThreadContext ThreadContextProperties 当LogicalThreadContext具有 LogicalThreadContextProperties 包。

    LogicalContext可能更常见地被称为“LDC”。 我将在这篇文章的其余部分使用这个简称。

    MDC属性使用 System.Threading.Thread.SetData 同时LDC属性使用 System.Runtime.Remoting.Messaging.CallContext.SetData .

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

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

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

    使用类似的本地thread(4.0)声明还是类似的.NET声明?

    归根结底,最不发达国家和最不发达国家之间真正的、实际的区别是什么?即使在阅读了上面链接的MSDN主题之后,我也不清楚。你什么时候真的会用一个来代替另一个?我看到的log4net和context的绝大多数引用/示例都是针对GDC(global-我理解)、NDC(nested-我也理解)和MDC的。在google搜索时,我能找到的LDC(或LogicalThreadContext)的大多数引用都与签入log4net源代码存储库有关,而不是实际使用情况。最不发达国家几乎从不提出问题或例子。

    我确实找到了 this link提供了一些与log4net开发人员Nicko Cadell的区别的很好的信息,但是我还是不清楚。

    与log4net没有直接关系的一个更大的问题是,两者之间的实际区别是什么线程集数据以及CallContext.SetData?

    根据 CallContext MSDN项目,CallContext数据可以传播到另一个AppDomain。要传播,存储在CallContext中的数据项必须公开 ILogicalThreadAffinative 接口。所以,这似乎是线程集数据和CallContext。

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

    也许这里有足够的东西可以让我回答我自己的问题,也许不行。我还在努力理解。

    如果您使用log4net,您是否都使用MDC和LDC?如果你使用MDC,是不是因为大多数“真实世界”的例子都使用它?如果你使用LDC,你有没有使用它的具体原因?如果你同时使用两者,你如何选择何时使用哪个?

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

    实际上,我在这里找到了一些有用的帖子,以便对讨论有所帮助:

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

    .Net: Logical thread and Thread Local Storage?

    1 回复  |  直到 7 年前
        1
  •  8
  •   Jon Skeet    14 年前

    这是猜测:这是警告。

    假设您正在编写一个服务器,服务一个请求意味着您必须与多个不同的服务进行通信。作为一个完全现代化的开发人员,您可以异步地发出这些请求,当所有的请求都被回复(或超时)时进行协调,以响应原始请求。

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