【问题标题】:Multiple logger instance for each application modules每个应用程序模块的多个记录器实例
【发布时间】:2013-10-17 15:46:27
【问题描述】:

我开始创建基于 Observable Pattern 的日志系统。为此,我使用反应式扩展。 我有一个名为 ILogInfo 的 IObservable 和一个名为 ILogObserver 的 IObserver。 我有一个主应用程序,其中包含使用共享库的各种模块。每个模块都实现了 ILogInfo 的观察者,并且模块可以并行工作。我的问题是,我只想观察在我的模块范围内注册的 ILogInfo。

在这个方案中,我有两个模块(模块 A 和模块 B),每个模块使用许多通过 ILogInfo 推送信息的库。当 LibC 推送一个新的 ILogInfo 时,我希望只有调用模块捕获(观察)信息。比如来自Module B的来电,我没有Module A观察到的信息,怎么办?

【问题讨论】:

  • 在 ILogInfo 中有一个“发件人”字段怎么样?然后您可以将日志推送到公共总线上,消费者可以使用 logBu​​s.Where(l=>l.Sender == moduleA) 过滤流
  • 感谢您的评论,但如果我这样做,我必须在每个级别转发发件人信息,而且我有太多库暂时无法考虑此解决方案。

标签: c# .net multithreading system.reactive


【解决方案1】:

这真的不是关于 Rx 的问题。您需要能够从 ILogInfo 获取调用上下文以正确路由它。

您可以从调用方显式提供该上下文(cmets 中的发送方建议似乎是一个简单、可行的建议),或者执行昂贵的堆栈遍历来确定调用模块(这在异步情况下不起作用) 否则您必须通过在 LogicalCallContext 中设置数据来维护 ExecutionContext 中的调用者 - 这适用于更多异步情况,但更复杂。

我不知道您的具体情况,但鉴于需要彻底隔离日志记录,我想知道在单独的每个模块 AppDomain 中托管库的多个副本是否更容易,让您完全隔离。

我希望这个要求有一个很好的理由,因为当现有的日志框架有很好的解决方案来提供上下文时感觉非常复杂(例如在日志应用程序块和 WCF 中的活动跟踪)。

【讨论】:

  • 感谢詹姆斯的回答。我们决定隔离 AppDomain 中的每个模块。这更简单,更安全,而且效果很好:)。剩下的只是找到我们如何在 AppDomain 之间交换数据,因为我们有一个在不同模块之间集中信息的库。
【解决方案2】:

我同意詹姆斯的观点。这不是一个真正的 Rx 问题。

我还有一个问题,当许多模块引用同一个库时,您将如何处理日志记录?

您是否有理由不考虑使用像 Log4Net 这样的通用日志记录解决方案?

【讨论】:

  • 你说得对,James,这不是 Rx 问题,我已经更改了我的问题标题。
  • 我们不使用 Log4Net、NLog 或其他日志记录解决方案,因为我们不想依赖特定的日志库。我们发现使用 Rx 的主要优点是我们可以为一个模块实现许多 Observer,这些模块可以使用 NLog 记录信息或将它们写入控制台或在用户界面中显示它们。
  • 我理解这种想法。然而,我原以为包装实现的简单 ILogger 接口就足够了。然后,您只需使用类别和侦听器来观察日志。
猜你喜欢
  • 2020-06-19
  • 1970-01-01
  • 2017-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多