每个应用程序模块的多个记录器实例

时间:2013-10-16 07:44:31

标签: c# .net multithreading system.reactive

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

Scheme Application

在这个方案中,我有两个模块(模块A和模块B),每个模块使用许多库,通过ILogInfo推送信息。当LibC推送一个新的ILogInfo时,我希望只有调用模块捕获(观察)信息。例如,当呼叫来自模块B时,我不知道模块A要观察的信息。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

这不是关于Rx的问题。您需要能够从ILogInfo调用上下文来适当地路由它。

你可以提供从调用者明确提供上下文(注释中的发送者建议似乎是一个简单,可行的建议)或者做一个昂贵的stackwalk来确定调用模块(在异步情况下不起作用) )或者你必须通过在LogicalCallContext中设置数据来维护ExecutionContext中的调用者 - 这在更多的异步情况下工作,但更复杂。

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

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

答案 1 :(得分:0)

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

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

您是否有理由不考虑像Log4Net这样的常见日志解决方案?