2013-10-16 139 views
0

我開始基於Observable模式創建一個日誌系統。爲此我使用Reactive Extensions。 我有一個名爲ILogInfo的IObservable和一個名爲ILogObserver的IObserver。 我有一個使用共享庫的各種模塊的主應用程序。每個模塊都實現了一個ILogInfo觀察器,這些模塊可以並行工作。我的問題在於,我想僅觀察在我的模塊範圍內註冊的ILogInfo。每個應用程序模塊的多個記錄器實例

Scheme Application

在此方案中,我有兩個模塊(模塊A和模塊B),每個模塊使用經由ILogInfo推送信息許多文庫。當LibC推送一個新的ILogInfo時,我希望只有調用模塊能夠捕獲(觀察)這些信息。例如,當呼叫來自模塊B時,我不需要模塊A觀察到的信息。我怎麼能這樣做?

+0

如何在ILogInfo中設置'發件人'字段?然後你可以將日誌推送到公共總線上,並且消費者可以使用logBu​​s.Where(l => l.Sender == moduleA) – 3dGrabber

+0

過濾流。感謝您的評論,但是如果我這樣做,我必須將發件人信息轉發目前我有太多的庫來考慮這個解決方案。 –

回答

1

這不是真的關於Rx的問題。您需要能夠從ILogInfo獲取調用上下文以適當地路由它。

你可以提供顯式地從調用者提供該上下文(註釋中的發送者建議看起來像是一個簡單的,可行的建議),或者做一個昂貴的stackwalk來確定調用模塊(這不會在異步情況),否則你必須通過設置LogicalCallContext中的數據來維護調用者的ExecutionContext - 這在更異步的情況下工作,但更復雜。

我不知道您的具體情況,但考慮到需要隔離日誌如此徹底,我想知道是否在單獨的每個模塊AppDomains中託管多個庫的副本可能更容易,從而使您完全隔離。

我希望這個需求有一個非常好的理由,因爲當現有的日誌框架具有提供上下文的良好解決方案時(例如在日誌應用程序塊和WCF中的活動跟蹤),感覺非常複雜。

+0

謝謝詹姆斯的回答。我們決定隔離AppDomain中的每個模塊。這更簡單,更安全,而且效果非常好:)。它只是爲了找到我們如何在AppDomain之間交換數據,因爲我們有一個集中不同模塊間信息的庫。 –

0

我同意詹姆斯在這裏。這不是一個真正的Rx問題。

我也有一個問題,你將如何處理記錄哪些模塊引用同一個庫的地方?

是否有一個原因,你沒有考慮像Log4Net這樣的常見Logging解決方案?

+0

你說的對,詹姆斯,這不是一個Rx的問題,我改變了我的問題標題。 –

+0

我們不使用Log4Net,NLog或其他日誌記錄解決方案,因爲我們不想依賴特定的日誌庫。我們發現使用Rx的主要優點是我們可以爲一個模塊實現許多Observer,這個模塊可以使用NLog記錄信息或將它們寫入控制檯或將它們顯示在用戶界面中。 –

+0

我明白這個想法。然而,我會認爲一個簡單的ILogger接口包裝實現就足夠了。然後,您只需使用類別和偵聽器來觀察日誌。 –