2012-04-11 20 views
6

EventLogからのイベントを処理する必要があります。これは、EventRecordWrittenイベントに添付するEventLogWatcherを使用すると簡単です。しかし私が興味を持っている質問(eventid == 299 || eventid == 500)は、私が必要とするよりも多くのイベントを提供します。ここにストリームの例がありますイベントログからイベントを処理し、特定のパターン(Rx?)に反応します

Event ID Correlation ID 
299  1AD... (this is actually a guid) X1 
500  1AD...        X2 
500  1AD... 
500  1AD... 
299  43B...        Y1 
299  EDB...        Z1 
500  43B...        Y2 
500  EDB...        Z2 
500  43B... 
500  43B... 

私は299イベントの相関idと一致するイベント299と最初のイベント500に興味があります。私は上記の流れでそれらをマークし、それは私が興味を持って出力コレクションです:おそらくキーとして相関IDと値としてEventRecordのタプルを使用して辞書をある[X1, X2, Y1, Y2, Z1, Z2]来るかもしれない一般的なイベントに

{ 1AD.., <X1, X2> } 
{ 43B.., <Y1, Y2> } 
{ EDB.., <Z1, Z2> } 

私は順番に(299と500)、並行性の高い状況では、2つの299のイベントが一緒に来て、次に500のイベントが起こることが予想されるので、イベントが来る順序に依存したくありません。相関IDはそれらを相関させるためのキーです(これはイベントの最初のプロパティですeventRecord.Properties[0]

これは状態マシンで解決できると思いますが、誰かがRxで解決策を思いつくのは面白いでしょうオブザーバブルへのクエリによって表されます。そうすれば、パターンマッチングロジックを1か所に保つことができます。

更新日:これは解決策です。 Gideonに感謝します。私が必要としていた出発点でした!事前に

var pairs = events 
      .Where(e299 => e299.EventArgs.EventRecord.Id == 299) 
      .SelectMany(e299 => events.Where(e500 => e500.EventArgs.EventRecord.Id == 500 && 
                e299.EventArgs.EventRecord.Properties[0].Value.ToString() == 
                e500.EventArgs.EventRecord.Properties[0].Value.ToString()) 
            .Take(1), 
         (e299, e500) => new { First = e299, Second = e500 }); 

おかげで、 マティアス

答えて

5

299イベントが常に500イベントの前に来る場合は、SelectManyWhereで十分です。

var events; //declared somewhere 

var pairs = from e299 in events 
      where e299.eventid == 299 
      from e500 in events 
      where e500.eventid == 500 && 
        e299.Correlation == e500.Correlation 
      select new with {Correlation = e299.Correlation, 
          First = e299, 
          Second = e500} 

ソースがそれぞれに複数の500件のイベントが299のイベントを相関している場合は、ラムダ構文に切り替えて、2番目のサブスクリプションにTake(1)を追加する必要があります。

+0

に注目!ありがとうギデオン...ラムダとテイク(1)を使用してクエリが私の答えに含まれていた – woloski

0

私はあなたが「ステートマシン」で何を意味するのか分かりません。

しかし、(eventid == 299 || eventid == 500)を収集するオブザーバーを書くことができます。スロットル戦略を使用して(最新の1000個のイベントまたは最新の分を収集する)、それはイベントのペアを検出したときにイベントを発生させます。299,500は同じGUIDを持ち、内部の辞書/リストから削除します。イベント。

その後、その種のオブザーバーはシステムの残りの部分で観測可能です。

たぶんリストは、イベントを収集することができ、新しいイベントが検出され、何か

よう

events.Where(E => e.eventid == newevent.eventid & &((e.id = = 299 & & newev.id == 500)||(e.id == 500 & & newev.id == 299))

はなくGUIDで辞書を有することが、性能が十分であってもよい。

あとで見て、Mathew!

+0

ありがとうございましたAngel ...イベントをバッファリングして分析するのが私の最初のアプローチでした。私は何か純粋なRXが欲しい。 – woloski

2

Observableを使用して見てください。ジョインで、これにより、希望するような複雑な結合パターンを作成することができます。

たとえば、https://stackoverflow.com/a/3868608/13131およびGuide to System.Reactive.Joinsを参照してください。

+0

私はAndとWhenを使用してみたが、正しい動作を達成することができませんでした。私はそれが何とか解決することができると確信していますが、まだRXとより多くの練習が必要です:)。ご協力いただきありがとうございます! – woloski

関連する問題