【问题标题】:log4net context for capturing browser capabilities用于捕获浏览器功能的 log4net 上下文
【发布时间】:2015-05-11 21:08:53
【问题描述】:

我想在 custom property 中使用 log4net 到 log browser capabilities。在这里使用的最佳context 是什么?

  • log4net.GlobalContext
  • log4net.ThreadContext
  • log4net.ThreadLogicalContext
  • log4net.Core.LoggingEvent

【问题讨论】:

    标签: c# asp.net-mvc logging log4net


    【解决方案1】:

    正如您在链接到的页面中所见,以下是所有这些上下文的预期差异:

    • 全局上下文由当前 AppDomain 中的所有线程共享。此上下文是线程安全的,可供多个线程同时使用。
    • 线程上下文仅对当前托管线程可见。
    • 逻辑线程上下文对逻辑线程可见。逻辑线程可以从一个托管线程跳转到另一个托管线程。有关更多详细信息,请参阅 .NET API System.Runtime.Remoting.Messaging.CallContext。
    • 每个事件都会在事件生成时捕获当前上下文状态。可以在事件本身上设置上下文数据。此上下文仅对生成事件本身的代码可见。

    如您所见,上下文会影响您的财产所在的范围。由于您想记录浏览器功能,因此您在 Web 应用程序中,所以我想是多个线程。如果您要将属性保存在共享上下文(全局)中,则可能会丢失信息。我不确定线程​​上下文,因为线程可能会在等待一些异步数据时接收其他请求。

    最后,事件上下文似乎是最安全和最合乎逻辑的选择,因为您肯定会为每个浏览器(或每个请求)记录一个事件,并且不需要与其他记录器共享此信息。

    【讨论】:

    • 谢谢萨米。虽然我还没有完全理解这里上下文的概念,但我想我现在可以继续按照你的建议使用事件上下文了。
    • 上下文通常可以被 log4net 中的范围替换。如果您想要所有记录器共享的属性,则范围/上下文应该是全局的。记录器在同一线程上共享的属性,上下文应该是线程。仅与您正在记录的消息相关的属性将使用事件上下文
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2018-07-11
    相关资源
    最近更新 更多