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 });
おかげで、 マティアス
に注目!ありがとうギデオン...ラムダとテイク(1)を使用してクエリが私の答えに含まれていた – woloski